com.laex.j2objc.preferences.PackagePrefixPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for com.laex.j2objc.preferences.PackagePrefixPropertyPage.java

Source

/*
 * Copyright (c) 2012, 2013 Hemanta Sapkota.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Hemanta Sapkota (laex.pearl@gmail.com)
 */
package com.laex.j2objc.preferences;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.ui.SharedImages;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.dialogs.PropertyPage;

import com.laex.j2objc.util.LogUtil;
import com.laex.j2objc.util.MessageUtil;
import com.laex.j2objc.util.ProjectUtil;
import com.laex.j2objc.util.PropertiesUtil;

/**
 * The Class PackagePrefixPropertyPage.
 */
public class PackagePrefixPropertyPage extends PropertyPage {

    /** The Constant PACKAGE_IMG. */
    public static final Image PACKAGE_IMG = new SharedImages().getImage(ISharedImages.IMG_OBJS_PACKAGE);

    /**
     * The Class TableLabelProvider.
     */
    private class TableLabelProvider extends LabelProvider implements ITableLabelProvider {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java
         * .lang.Object, int)
         */
        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 0)
                return PACKAGE_IMG;

            return null;
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.
         * lang.Object, int)
         */
        public String getColumnText(Object element, int columnIndex) {
            if (columnIndex == 0)
                return (String) element;

            if (columnIndex == 1)
                return (String) pkgPrefix.get((String) element);

            return null;
        }
    }

    /**
     * The Class ContentProvider.
     */
    private class ContentProvider implements IStructuredContentProvider {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(
         * java.lang.Object)
         */
        public Object[] getElements(Object inputElement) {
            return ((Set<String>) inputElement).toArray();
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
         * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /** The table. */
    private Table table;

    /** The table viewer. */
    private TableViewer tableViewer;

    /** The pkg list. */
    private Set<String> pkgList;

    /** The pkg prefix. */
    private Properties pkgPrefix = new Properties();

    /** The btn edit. */
    private Button btnEdit;

    /** The btn reset. */
    private Button btnReset;

    /**
     * Instantiates a new package prefix property page.
     */
    public PackagePrefixPropertyPage() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse
     * .swt.widgets.Composite)
     */
    @Override
    public Control createContents(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout(2, false));

        tableViewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
        tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                onSelectionChanged(event);
            }
        });
        table = tableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn tblclmnPackage = tableViewerColumn.getColumn();
        tblclmnPackage.setMoveable(true);
        tblclmnPackage.setWidth(100);
        tblclmnPackage.setText("Package");

        TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn tblclmnPrefix = tableViewerColumn_1.getColumn();
        tblclmnPrefix.setWidth(170);
        tblclmnPrefix.setText("Prefix");
        tableViewer.setLabelProvider(new TableLabelProvider());
        tableViewer.setContentProvider(new ContentProvider());

        Composite composite = new Composite(container, SWT.NONE);
        composite.setLayout(new RowLayout(SWT.VERTICAL));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));

        btnEdit = new Button(composite, SWT.NONE);
        btnEdit.setLayoutData(new RowData(76, SWT.DEFAULT));
        btnEdit.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                editPrefix();
            }
        });
        btnEdit.setText("Edit");
        btnEdit.setEnabled(false);

        btnReset = new Button(composite, SWT.NONE);
        btnReset.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                resetSelection();
            }
        });
        btnReset.setLayoutData(new RowData(76, SWT.DEFAULT));
        btnReset.setText("Reset");
        btnReset.setEnabled(false);

        Button btnResetAll = new Button(composite, SWT.NONE);
        btnResetAll.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                resetAll();
            }
        });
        btnResetAll.setText("Reset All");

        Label label = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
        label.setLayoutData(new RowData(79, 2));

        Button btnSetAllBlank = new Button(composite, SWT.NONE);
        btnSetAllBlank.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                blankAll();
            }
        });
        btnSetAllBlank.setText("Set Blank");

        try {
            loadProperties();
            loadPackages();
            tableViewer.setInput(pkgList);
        } catch (CoreException e) {
            e.printStackTrace();
        }

        return container;
    }

    /**
     * On selection changed.
     *
     * @param event the event
     */
    protected void onSelectionChanged(SelectionChangedEvent event) {
        if (event.getSelection().isEmpty()) {
            btnEdit.setEnabled(false);
            btnReset.setEnabled(false);
        } else {
            btnEdit.setEnabled(true);
            btnReset.setEnabled(true);
        }
    }

    /**
     * Reset all.
     */
    protected void resetAll() {
        int resp = MessageUtil.messageRemoveItems(getShell());

        if (resp == SWT.OK) {
            for (String s : pkgList) {
                pkgPrefix.remove(s);
            }
            tableViewer.refresh();
        }
    }

    /**
     * Blank all.
     */
    protected void blankAll() {
        int resp = MessageUtil.messageSetAllPrefixBlank(getShell());

        if (resp == SWT.OK) {
            for (String key : pkgList) {
                pkgPrefix.put(key, " ");
            }
            tableViewer.refresh();
        }
    }

    /**
     * Gets the selected package.
     *
     * @return the selected package
     */
    private String getSelectedPackage() {
        IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
        return (String) selection.getFirstElement();
    }

    /**
     * Reset selection.
     */
    protected void resetSelection() {
        String selectedPackage = getSelectedPackage();
        pkgPrefix.remove(selectedPackage);
        tableViewer.refresh();
    }

    /**
     * Edits the prefix.
     */
    protected void editPrefix() {
        String selectedPkg = getSelectedPackage();
        String p = pkgPrefix.getProperty(selectedPkg);

        if (p == null)
            p = "";

        PackagePrefixEditDialog pped = new PackagePrefixEditDialog(getShell(), selectedPkg, p);

        if (pped.open() == PackagePrefixEditDialog.OK) {
            String prefix = pped.getPrefix();
            pkgPrefix.put(selectedPkg, prefix);
            tableViewer.refresh();
        }
    }

    /**
     * Load packages.
     *
     * @throws CoreException the core exception
     */
    private void loadPackages() throws CoreException {
        pkgList = new HashSet<String>();
        ProjectUtil.getJavaProject(getElement()).getResource().accept(new IResourceVisitor() {
            @Override
            public boolean visit(IResource resource) throws CoreException {
                if (JavaCore.isJavaLikeFileName(resource.getName())) {
                    ICompilationUnit compU = JavaCore.createCompilationUnitFrom((IFile) resource);

                    // Wrap with exception, in case the project does not have
                    // any pacakgaes declared
                    try {
                        pkgList.add(compU.getPackageDeclarations()[0].getElementName());
                    } catch (ArrayIndexOutOfBoundsException aiobx) {
                        LogUtil.logException(aiobx);
                    }

                }
                return true;
            }
        });
    }

    /**
     * Load properties.
     *
     * @throws CoreException the core exception
     */
    private void loadProperties() throws CoreException {
        IJavaProject javaProject = ProjectUtil.getJavaProject(getElement());

        String propertiesFilePath = PropertiesUtil.constructPrefixPropertiesFilePath(javaProject.getProject());
        IFile propertiesFile = javaProject.getProject().getFile(propertiesFilePath);

        if (propertiesFile.exists()) {

            try {
                pkgPrefix.load(propertiesFile.getContents());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        IJavaProject javaProject = (IJavaProject) getElement();

        String propertiesFilePath = getPropertiesFileName(javaProject);
        IFile propertiesFile = javaProject.getProject().getFile(propertiesFilePath);

        if (propertiesFile.exists()) {
            try {
                propertiesFile.delete(true, null);
            } catch (CoreException e) {
                LogUtil.logException(e);
            }
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        try {
            pkgPrefix.store(baos, "");
            propertiesFile.create(new ByteArrayInputStream(baos.toByteArray()), false, null);
        } catch (IOException e) {
            LogUtil.logException(e);
        } catch (CoreException e) {
            LogUtil.logException(e);
        }

        return super.performOk();
    }

    /**
     * Gets the properties file name.
     *
     * @param javaProject the java project
     * @return the properties file name
     */
    private String getPropertiesFileName(IJavaProject javaProject) {
        return new StringBuilder(".").append(javaProject.getElementName()).append("-prefixes").toString();
    }

}