X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=case-study%2Fjdt-after%2Fui%2Forg%2Feclipse%2Fjdt%2Finternal%2Fui%2Fpreferences%2FSourceAttachmentPropertyPage.java;fp=case-study%2Fjdt-after%2Fui%2Forg%2Feclipse%2Fjdt%2Finternal%2Fui%2Fpreferences%2FSourceAttachmentPropertyPage.java;h=092b8c0cba33007084811ed3fb540b990c8a9fed;hb=1b2798f607d741df30e5197f427381cbff326adc;hp=0000000000000000000000000000000000000000;hpb=246231e4bd9b24345490f369747c0549ca308c4d;p=ifi-stolz-refaktor.git diff --git a/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/SourceAttachmentPropertyPage.java b/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/SourceAttachmentPropertyPage.java new file mode 100644 index 00000000..092b8c0c --- /dev/null +++ b/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/SourceAttachmentPropertyPage.java @@ -0,0 +1,243 @@ +/******************************************************************************* + * Copyright (c) 2000, 2012 IBM Corporation and others. + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.preferences; + +import java.lang.reflect.InvocationTargetException; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.operation.IRunnableWithProgress; + +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.PropertyPage; + +import org.eclipse.jdt.core.ClasspathContainerInitializer; +import org.eclipse.jdt.core.IClasspathAttribute; +import org.eclipse.jdt.core.IClasspathContainer; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; + +import org.eclipse.jdt.internal.corext.util.JavaModelUtil; +import org.eclipse.jdt.internal.corext.util.Messages; + +import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; +import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.eclipse.jdt.internal.ui.dialogs.StatusUtil; +import org.eclipse.jdt.internal.ui.util.ExceptionHandler; +import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; +import org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener; +import org.eclipse.jdt.internal.ui.wizards.buildpaths.SourceAttachmentBlock; + +/** + * Property page to configure a archive's JARs source attachment + */ +public class SourceAttachmentPropertyPage extends PropertyPage implements IStatusChangeListener { + + private SourceAttachmentBlock fSourceAttachmentBlock; + private IPackageFragmentRoot fRoot; + private IPath fContainerPath; + private IClasspathEntry fEntry; + + public SourceAttachmentPropertyPage() { + } + + /* + * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) + */ + @Override + public void createControl(Composite parent) { + super.createControl(parent); + PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.SOURCE_ATTACHMENT_PROPERTY_PAGE); + } + + /* + * @see PreferencePage#createContents + */ + @Override + protected Control createContents(Composite composite) { + initializeDialogUnits(composite); + Control result= createPageContent(composite); + Dialog.applyDialogFont(result); + return result; + } + + private Control createPageContent(Composite composite) { + try { + fContainerPath= null; + fEntry= null; + fRoot= getJARPackageFragmentRoot(); + if (fRoot == null || fRoot.getKind() != IPackageFragmentRoot.K_BINARY) { + return createMessageContent(composite, PreferencesMessages.SourceAttachmentPropertyPage_noarchive_message, null); + } + + IPath containerPath= null; + IJavaProject jproject= fRoot.getJavaProject(); + IClasspathEntry entry= JavaModelUtil.getClasspathEntry(fRoot); + boolean canEditEncoding= true; + if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) { + containerPath= entry.getPath(); + ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(containerPath.segment(0)); + IClasspathContainer container= JavaCore.getClasspathContainer(containerPath, jproject); + if (initializer == null || container == null) { + return createMessageContent(composite, Messages.format(PreferencesMessages.SourceAttachmentPropertyPage_invalid_container, BasicElementLabels.getPathLabel(containerPath, false)), fRoot); + } + String containerName= container.getDescription(); + + IStatus status= initializer.getSourceAttachmentStatus(containerPath, jproject); + if (status.getCode() == ClasspathContainerInitializer.ATTRIBUTE_NOT_SUPPORTED) { + return createMessageContent(composite, Messages.format(PreferencesMessages.SourceAttachmentPropertyPage_not_supported, containerName), null); + } + if (status.getCode() == ClasspathContainerInitializer.ATTRIBUTE_READ_ONLY) { + return createMessageContent(composite, Messages.format(PreferencesMessages.SourceAttachmentPropertyPage_read_only, containerName), fRoot); + } + IStatus attributeStatus= initializer.getAttributeStatus(containerPath, jproject, IClasspathAttribute.SOURCE_ATTACHMENT_ENCODING); + canEditEncoding= !(attributeStatus.getCode() == ClasspathContainerInitializer.ATTRIBUTE_NOT_SUPPORTED || attributeStatus.getCode() == ClasspathContainerInitializer.ATTRIBUTE_READ_ONLY); + + entry= JavaModelUtil.findEntryInContainer(container, fRoot.getPath()); + } + fContainerPath= containerPath; + fEntry= entry; + + fSourceAttachmentBlock= new SourceAttachmentBlock(this, entry, canEditEncoding); + return fSourceAttachmentBlock.createControl(composite); + } catch (CoreException e) { + JavaPlugin.log(e); + return createMessageContent(composite, PreferencesMessages.SourceAttachmentPropertyPage_noarchive_message, null); + } + } + + + private Control createMessageContent(Composite composite, String message, IPackageFragmentRoot root) { + Composite inner= new Composite(composite, SWT.NONE); + GridLayout layout= new GridLayout(); + layout.marginHeight= 0; + layout.marginWidth= 0; + inner.setLayout(layout); + + GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.widthHint= convertWidthInCharsToPixels(80); + + Label label= new Label(inner, SWT.LEFT + SWT.WRAP); + label.setLayoutData(gd); + + try { + if (root != null) { + message= message + "\n\n" + PreferencesMessages.SourceAttachmentPropertyPage_location_path; //$NON-NLS-1$ + + Text location= new Text(inner, SWT.READ_ONLY | SWT.WRAP); + gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.widthHint= convertWidthInCharsToPixels(80); + location.setLayoutData(gd); + IPath sourceAttachmentPath= root.getSourceAttachmentPath(); + String locationPath= PreferencesMessages.SourceAttachmentPropertyPage_locationPath_none; + if (sourceAttachmentPath != null) + locationPath= sourceAttachmentPath.toString(); + location.setText(locationPath); + } + } catch (JavaModelException e) { + JavaPlugin.log(e); + // don't show location + } + + label.setText(message); + return inner; + } + + + /* + * @see IPreferencePage#performOk + */ + @Override + public boolean performOk() { + if (fSourceAttachmentBlock != null) { + try { + IClasspathEntry entry= fSourceAttachmentBlock.getNewEntry(); + if (entry.equals(fEntry)) { + return true; // no change + } + + IRunnableWithProgress runnable= SourceAttachmentBlock.getRunnable(getShell(), entry, fRoot.getJavaProject(), fContainerPath, fEntry.getReferencingEntry() != null); + PlatformUI.getWorkbench().getProgressService().run(true, true, runnable); + } catch (InvocationTargetException e) { + String title= PreferencesMessages.SourceAttachmentPropertyPage_error_title; + String message= PreferencesMessages.SourceAttachmentPropertyPage_error_message; + ExceptionHandler.handle(e, getShell(), title, message); + return false; + } catch (InterruptedException e) { + // cancelled + return false; + } + } + return true; + } + + /* + * @see PreferencePage#performDefaults() + */ + @Override + protected void performDefaults() { + if (fSourceAttachmentBlock != null) { + fSourceAttachmentBlock.setDefaults(); + } + super.performDefaults(); + } + + private IPackageFragmentRoot getJARPackageFragmentRoot() throws CoreException { + // try to find it as Java element (needed for external jars) + IAdaptable adaptable= getElement(); + IJavaElement elem= (IJavaElement) adaptable.getAdapter(IJavaElement.class); + if (elem instanceof IPackageFragmentRoot) { + return (IPackageFragmentRoot) elem; + } + // not on classpath or not in a java project + IResource resource= (IResource) adaptable.getAdapter(IResource.class); + if (resource instanceof IFile) { + IProject proj= resource.getProject(); + if (proj.hasNature(JavaCore.NATURE_ID)) { + IJavaProject jproject= JavaCore.create(proj); + return jproject.getPackageFragmentRoot(resource); + } + } + return null; + } + + + /* + * @see IStatusChangeListener#statusChanged + */ + public void statusChanged(IStatus status) { + setValid(!status.matches(IStatus.ERROR)); + StatusUtil.applyToStatusLine(this, status); + } + + + +}