/** * 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" }, null); //$NON-NLS-1$ 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), urlText.getText()); //$NON-NLS-1$ 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; } }