com.aptana.ide.editor.css.preview.CSSPreviewPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.editor.css.preview.CSSPreviewPropertyPage.java

Source

/**
 * Copyright (c) 2005-2008 Aptana, Inc.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Aptana Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.aptana.com/legal/apl/.
 *
 * Redistribution, except as permitted by the above license, is prohibited.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ide.editor.css.preview;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.internal.WorkbenchPlugin;

import com.aptana.ide.core.IdeLog;
import com.aptana.ide.editor.css.CSSPlugin;

/**
 * @author Kevin Sawicki (ksawicki@aptana.com)
 */
public class CSSPreviewPropertyPage extends PropertyPage {

    /**
     * PREVIEW_PREFIX
     */
    public static final String CSS_PREVIEW_PATH = "CSS_PREVIEW_PATH"; //$NON-NLS-1$

    /**
     * CSS_PREVIEW_TYPE
     */
    public static final String CSS_PREVIEW_TYPE = "CSS_PREVIEW_TYPE"; //$NON-NLS-1$

    /**
     * URL_TYPE
     */
    public static final String URL_TYPE = "URL_TYPE"; //$NON-NLS-1$

    /**
     * PROJECT_TYPE
     */
    public static final String PROJECT_TYPE = "PROJECT_TYPE"; //$NON-NLS-1$

    /**
     * CSS_PREVIEW_OVERRIDE
     */
    public static final String CSS_PREVIEW_OVERRIDE = "CSS_PREVIEW_OVERRIDE"; //$NON-NLS-1$

    /**
     * TRUE
     */
    public static final String TRUE = "true"; //$NON-NLS-1$

    /**
     * FALSE
     */
    public static final String FALSE = "false"; //$NON-NLS-1$

    private IEditorRegistry registry = WorkbenchPlugin.getDefault().getEditorRegistry();
    private Map<IEditorDescriptor, Image> images = new HashMap<IEditorDescriptor, Image>();
    private Table projectFiles;
    private Button override;
    private Group preview;
    private Button useProjectFile;
    private Button useURL;
    private Label urlLabel;
    private Text urlText;
    private Button browseButton;
    private IResource resource;

    /**
     * Constructor for SamplePropertyPage.
     */
    public CSSPreviewPropertyPage() {
        super();
    }

    /**
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(1, true);
        composite.setLayout(layout);
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
        composite.setLayoutData(data);

        Composite top = new Composite(composite, SWT.NONE);
        GridLayout topLayout = new GridLayout(2, false);
        topLayout.marginHeight = 0;
        topLayout.marginWidth = 0;
        top.setLayout(topLayout);
        top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        override = new Button(top, SWT.CHECK);
        override.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        override.setSelection(false);
        override.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                boolean ov = override.getSelection();
                useProjectFile.setEnabled(ov);
                useURL.setEnabled(ov);
                if (ov) {
                    if (useProjectFile.getSelection()) {
                        projectFiles.setEnabled(true);
                    } else if (useURL.getSelection()) {
                        urlText.setEnabled(true);
                        browseButton.setEnabled(true);
                    }
                } else {
                    urlText.setEnabled(false);
                    browseButton.setEnabled(false);
                    projectFiles.setEnabled(false);
                }
            }

        });

        Link goToParent = new Link(top, SWT.NONE);
        goToParent.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (resource != null) {
                    if (resource instanceof IProject) {
                        PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
                                Display.getDefault().getActiveShell(),
                                "com.aptana.ide.editor.css.preferences.PreviewPreferencePage", //$NON-NLS-1$
                                new String[] { "com.aptana.ide.editor.css.preferences.PreviewPreferencePage" }, //$NON-NLS-1$
                                null);
                        dialog.open();
                    } else if (resource instanceof IFile) {
                        PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(
                                Display.getDefault().getActiveShell(), resource.getProject(),
                                "com.aptana.ide.editor.css.preview.cssPreviewPropertyPage", //$NON-NLS-1$
                                new String[] { "com.aptana.ide.editor.css.preview.cssPreviewPropertyPage" }, null); //$NON-NLS-1$
                        dialog.open();
                    }
                }
            }

        });
        goToParent.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));

        preview = new Group(composite, SWT.NONE);
        preview.setText(Messages.CSSPreviewPropertyPage_PreviewText);
        GridLayout pLayout = new GridLayout(1, true);
        pLayout.marginHeight = 10;
        preview.setLayout(pLayout);
        preview.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        useProjectFile = new Button(preview, SWT.RADIO);
        useProjectFile.setText(Messages.CSSPreviewPropertyPage_UseProjectFileText);
        useProjectFile.setSelection(true);
        useProjectFile.setEnabled(false);
        useProjectFile.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                projectFiles.setEnabled(true);
                urlText.setEnabled(false);
                browseButton.setEnabled(false);
            }

        });

        Group projectGroup = new Group(preview, SWT.NONE);
        projectGroup.setText(Messages.CSSPreviewPropertyPage_ProjectFilesText);
        GridLayout pgLayout = new GridLayout(1, true);
        pgLayout.marginHeight = 0;
        pgLayout.marginWidth = 0;
        projectGroup.setLayout(pgLayout);
        GridData pgData = new GridData(SWT.FILL, SWT.FILL, true, true);
        pgData.horizontalIndent = 10;
        projectGroup.setLayoutData(pgData);
        projectFiles = new Table(projectGroup, SWT.CHECK | SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
        projectFiles.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (e.detail == SWT.CHECK) {
                    TableItem[] items = projectFiles.getItems();
                    for (int i = 0; i < items.length; i++) {
                        TableItem item = items[i];
                        if (item != e.item) {
                            item.setChecked(false);
                        }
                    }
                }
            }

        });
        projectFiles.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        projectFiles.setLinesVisible(true);
        new TableColumn(projectFiles, SWT.LEFT);
        projectFiles.addControlListener(new ControlAdapter() {

            public void controlResized(ControlEvent e) {
                TableColumn c = projectFiles.getColumn(0);
                Point size = projectFiles.getSize();

                // Mac fix for always having a vertical scrollbar and not calculating it affects the horizontal scroll
                // bar
                if (Platform.getOS().equals(Platform.OS_MACOSX)) {
                    ScrollBar vScrolls = projectFiles.getVerticalBar();
                    if (vScrolls != null) {
                        size.x = size.x - vScrolls.getSize().x - 5;
                    }
                }
                c.setWidth(size.x - 6);
            }

        });
        projectFiles.setEnabled(false);

        useURL = new Button(preview, SWT.RADIO);
        useURL.setText(Messages.CSSPreviewPropertyPage_UseURLText);
        useURL.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                projectFiles.setEnabled(false);
                urlText.setEnabled(true);
                browseButton.setEnabled(true);
            }

        });
        useURL.setSelection(false);
        useURL.setEnabled(false);

        Composite url = new Composite(preview, SWT.NONE);
        GridLayout urlLayout = new GridLayout(3, false);
        urlLayout.marginHeight = 0;
        urlLayout.marginWidth = 0;
        url.setLayout(urlLayout);
        GridData uData = new GridData(SWT.FILL, SWT.FILL, true, false);
        uData.horizontalIndent = 17;
        url.setLayoutData(uData);
        urlLabel = new Label(url, SWT.LEFT);
        urlLabel.setText(Messages.CSSPreviewPropertyPage_URLText);
        urlText = new Text(url, SWT.SINGLE | SWT.BORDER);
        urlText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        urlText.setEnabled(false);
        browseButton = new Button(url, SWT.PUSH);
        browseButton.setText(Messages.CSSPreviewPropertyPage_BrowseText);
        browseButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                FileDialog dialog = new FileDialog(browseButton.getShell(), SWT.OPEN);
                String file = dialog.open();
                if (file != null) {
                    urlText.setText(file);
                }
            }

        });
        browseButton.setEnabled(false);

        try {
            resource = (IResource) getElement();
            String override = resource.getPersistentProperty(new QualifiedName("", CSS_PREVIEW_OVERRIDE)); //$NON-NLS-1$
            String previewPath = resource.getPersistentProperty(new QualifiedName("", CSS_PREVIEW_PATH)); //$NON-NLS-1$
            String previewType = resource.getPersistentProperty(new QualifiedName("", CSS_PREVIEW_TYPE)); //$NON-NLS-1$
            IProject project = null;
            if (resource instanceof IProject) {
                project = (IProject) resource;
                this.override.setText(Messages.CSSPreviewPropertyPage_OverrideWorkspaceText);
                goToParent.setText("<a>" + Messages.CSSPreviewPropertyPage_OverrideWorkspaceLinkText + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
            } else if (resource instanceof IFile) {
                project = resource.getProject();
                this.override.setText(Messages.CSSPreviewPropertyPage_OverrideProjectText);
                goToParent.setText("<a>" + Messages.CSSPreviewPropertyPage_OverrideProjectLinkText + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
            }
            if (project != null) {
                buildTable(project);
            }
            if (TRUE.equals(override)) {
                this.override.setSelection(true);
                useURL.setEnabled(true);
                useProjectFile.setEnabled(true);
                if (URL_TYPE.equals(previewType)) {
                    useURL.setSelection(true);
                    useProjectFile.setSelection(false);
                    urlText.setEnabled(true);
                    browseButton.setEnabled(true);
                    urlText.setText(previewPath);
                } else {
                    useURL.setSelection(false);
                    useProjectFile.setSelection(true);
                    projectFiles.setEnabled(true);
                    if (project != null && previewPath != null) {
                        IFile[] candidates = ResourcesPlugin.getWorkspace().getRoot()
                                .findFilesForLocation(new Path(previewPath));
                        IResource resource = null;
                        for (int i = 0; i < candidates.length; i++) {
                            if (project.equals(candidates[i].getProject())) {
                                resource = candidates[i];
                                break;
                            }
                        }
                        if (resource != null && resource.exists()) {
                            TableItem[] items = projectFiles.getItems();
                            for (int i = 0; i < items.length; i++) {
                                IResource file = (IResource) items[i].getData();
                                if (resource.equals(file)) {
                                    items[i].setChecked(true);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        } catch (CoreException e) {
            IdeLog.logError(CSSPlugin.getDefault(), "Error getting element", e); //$NON-NLS-1$
        }
        return composite;
    }

    private void buildTable(IResource root) {
        if (root instanceof IContainer) {
            IResource[] members;
            try {
                members = ((IContainer) root).members();
                for (int i = 0; i < members.length; i++) {
                    if (members[i] instanceof IFile) {
                        TableItem item = new TableItem(projectFiles, SWT.NONE);
                        item.setData(members[i]);
                        item.setText(members[i].getProjectRelativePath().toString());
                        IEditorDescriptor desc = registry.getDefaultEditor(members[i].getName());
                        if (desc == null || desc.getImageDescriptor() == null) {
                            IWorkbench workbench = PlatformUI.getWorkbench();
                            ISharedImages sharedImages = workbench.getSharedImages();
                            sharedImages.getImage(ISharedImages.IMG_OBJ_FILE);
                        } else {
                            Image image = null;
                            if (images.containsKey(desc)) {
                                image = images.get(desc);
                            } else {
                                image = desc.getImageDescriptor().createImage();
                                images.put(desc, image);
                            }
                            item.setImage(image);
                        }
                    } else {
                        buildTable(members[i]);
                    }
                }
            } catch (CoreException e) {
                IdeLog.logError(CSSPlugin.getDefault(), "Error retrieving project files", e); //$NON-NLS-1$
            }

        }
    }

    /**
     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
     */
    protected void performDefaults() {

    }

    /**
     * @see org.eclipse.jface.dialogs.DialogPage#dispose()
     */
    public void dispose() {
        super.dispose();
        Iterator<Image> iter = images.values().iterator();
        while (iter.hasNext()) {
            iter.next().dispose();
        }
    }

    /**
     * @see org.eclipse.jface.preference.IPreferencePage#performOk()
     */
    public boolean performOk() {
        if (this.resource != null) {
            if (override.getSelection()) {
                try {
                    this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_OVERRIDE), TRUE); //$NON-NLS-1$
                } catch (CoreException e) {
                    IdeLog.logError(CSSPlugin.getDefault(), "Error saving preview preferences", e); //$NON-NLS-1$
                }
                if (useURL.getSelection()) {
                    try {
                        this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_PATH), //$NON-NLS-1$
                                urlText.getText());
                        this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_TYPE), URL_TYPE); //$NON-NLS-1$
                    } catch (CoreException e) {
                        IdeLog.logError(CSSPlugin.getDefault(), "Error saving preview preferences", e); //$NON-NLS-1$
                    }

                } else if (useProjectFile.getSelection()) {
                    try {
                        TableItem[] items = projectFiles.getItems();
                        for (int i = 0; i < items.length; i++) {
                            if (items[i].getChecked()) {
                                IResource file = (IResource) items[i].getData();
                                this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_PATH), file //$NON-NLS-1$
                                        .getLocation().makeAbsolute().toOSString());
                                this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_TYPE), //$NON-NLS-1$
                                        PROJECT_TYPE);
                                break;
                            }
                        }
                    } catch (CoreException e) {
                        IdeLog.logError(CSSPlugin.getDefault(), "Error saving preview preferences", e); //$NON-NLS-1$
                    }
                }
            } else {
                try {
                    this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_PATH), null); //$NON-NLS-1$
                    this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_TYPE), null); //$NON-NLS-1$
                    this.resource.setPersistentProperty(new QualifiedName("", CSS_PREVIEW_OVERRIDE), FALSE); //$NON-NLS-1$
                } catch (CoreException e) {
                    IdeLog.logError(CSSPlugin.getDefault(), "Error saving preview preferences", e); //$NON-NLS-1$
                }
            }
        }
        return true;
    }

}