1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

More support for Libaryentry

This commit is contained in:
Alain Magloire 2004-05-06 04:19:19 +00:00
parent 2c9b2f90fa
commit dd52df1494
10 changed files with 987 additions and 48 deletions

View file

@ -173,7 +173,7 @@ public class CProject extends Openable implements ICProject {
for (int i = 0; i < binConfigs.length; i++) {
IBinaryFile bin;
try {
bin = binConfigs[i].getBinaryParser().getBinary(entry.getPath());
bin = binConfigs[i].getBinaryParser().getBinary(entry.getFullLibraryPath());
if (bin != null) {
if (bin.getType() == IBinaryFile.ARCHIVE) {
lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin);

View file

@ -0,0 +1,101 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
/**
* ArchiveFileFilter
*/
/**
* Viewer filter for archive selection dialogs.
* Archives are files with file extension "a", "dll", "so.
* The filter is not case sensitive.
*/
public class ArchiveFileFilter extends ViewerFilter {
private static final String[] fgArchiveExtensions= { "a", "so", "dll" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private List fExcludes;
private boolean fRecursive;
/**
* @param excludedFiles Excluded files will not pass the filter.
* <code>null</code> is allowed if no files should be excluded.
* @param recusive Folders are only shown if, searched recursivly, contain
* an archive
*/
public ArchiveFileFilter(IFile[] excludedFiles, boolean recusive) {
if (excludedFiles != null) {
fExcludes= Arrays.asList(excludedFiles);
} else {
fExcludes= null;
}
fRecursive= recusive;
}
/*
* @see ViewerFilter#select
*/
public boolean select(Viewer viewer, Object parent, Object element) {
if (element instanceof IFile) {
if (fExcludes != null && fExcludes.contains(element)) {
return false;
}
return isArchivePath(((IFile)element).getFullPath());
} else if (element instanceof IContainer) { // IProject, IFolder
if (!fRecursive) {
return true;
}
try {
IResource[] resources= ((IContainer)element).members();
for (int i= 0; i < resources.length; i++) {
// recursive! Only show containers that contain an archive
if (select(viewer, parent, resources[i])) {
return true;
}
}
} catch (CoreException e) {
CUIPlugin.getDefault().log(e.getStatus());
}
}
return false;
}
public static boolean isArchivePath(IPath path) {
String ext= path.getFileExtension();
if (ext != null && ext.length() != 0) {
return isArchiveFileExtension(ext);
}
return false;
}
public static boolean isArchiveFileExtension(String ext) {
for (int i= 0; i < fgArchiveExtensions.length; i++) {
if (ext.equalsIgnoreCase(fgArchiveExtensions[i])) {
return true;
}
}
return false;
}
}

View file

@ -159,6 +159,9 @@ LibrariesEntryPage.libraries.addcontriblib.button=Add &Contributed...
LibrariesEntryPage.libraries.addworkspacelib.button=Add from Workspace...
LibrariesEntryPage.libraries.edit.button=&Edit...
LibrariesEntryPage.ContainerDialog.new.title=Contributed Library Path Selection
LibrariesEntryPage.ContainerDialog.edit.title=Contributed Library Path Selection
LibrariesWorkbookPage.ExistingClassFolderDialog.new.title=Class Folder Selection
LibrariesWorkbookPage.ExistingClassFolderDialog.new.description=&Choose class folders to be added to the build path:
@ -241,3 +244,39 @@ NewSourceFolderDialog.error.pathexists=The folder is already in the list.
FolderSelectionDialog.button=Create &New Folder...
MultipleFolderSelectionDialog.button=Create &New Folder...
# ------- SourceAttachmentBlock-------
SourceAttachmentBlock.message=Select the location (folder, JAR or zip) containing the source for ''{0}'':
SourceAttachmentBlock.filename.description=Source attachments for variable entries are defined by variable paths. The first segment of such a path describes a variable name, the rest is an optional path extension.
SourceAttachmentBlock.filename.label=Lo&cation path:
SourceAttachmentBlock.filename.externalfile.button=External &File...
SourceAttachmentBlock.filename.externalfolder.button=External F&older...
SourceAttachmentBlock.filename.internal.button=&Workspace...
SourceAttachmentBlock.filename.varlabel=Lo&cation variable path:
SourceAttachmentBlock.filename.variable.button=&Variable...
SourceAttachmentBlock.filename.external.varbutton=&Extension....
SourceAttachmentBlock.filename.error.notvalid= The archive path is not a valid path.
SourceAttachmentBlock.filename.error.filenotexists= The path ''{0}'' does not exist.
SourceAttachmentBlock.filename.error.varnotexists= The variable in the location variable path does not exist.
SourceAttachmentBlock.filename.error.deviceinpath= The location variable path must begin with a variable.
SourceAttachmentBlock.filename.warning.varempty= The location variable path is empty.
SourceAttachmentBlock.intjardialog.title=Source Location Selection
SourceAttachmentBlock.intjardialog.message=&Select folder or JAR/zip archive containing the source:
SourceAttachmentBlock.extvardialog.title=Variable Extension Selection
SourceAttachmentBlock.extvardialog.description=Select source location:
SourceAttachmentBlock.extjardialog.text=JAR/ZIP File Selection
SourceAttachmentBlock.extfolderdialog.text=Folder Selection
SourceAttachmentBlock.putoncpdialog.title=Setting Source Attachment
SourceAttachmentBlock.putoncpdialog.message=Source can only be attached to libraries on the build path.\nDo you want to add the library to the build path?
SourceAttachmentDialog.title=Source Attachment Configuration
SourceAttachmentDialog.error.title=Error Attaching Source
SourceAttachmentDialog.error.message=An error occurred while associating the source.

View file

@ -219,7 +219,7 @@ public class CPathIncludeEntryPage extends ExtendedCPathBasePage {
title = CPathEntryMessages.getString("IncludeEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
elem = existing.getPathEntry();
}
CPathContainerWizard wizard = new CPathContainerWizard(elem, null, (ICElement)getSelection().get(0), getRawClasspath(),
CPathContainerWizard wizard = new CPathContainerWizard(elem, null, (ICElement)getSelection().get(0), getRawPathEntries(),
IPathEntry.CDT_INCLUDE);
wizard.setWindowTitle(title);
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {

View file

@ -16,6 +16,7 @@ import java.util.HashSet;
import java.util.List;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILibraryEntry;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.util.PixelConverter;
@ -39,6 +40,7 @@ import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
@ -177,11 +179,11 @@ public class CPathLibraryEntryPage extends CPathBasePage {
}
public void doubleClicked(TreeListDialogField field) {
//libraryPageDoubleClicked(field);
libraryPageDoubleClicked(field);
}
public void keyPressed(TreeListDialogField field, KeyEvent event) {
//libraryPageKeyPressed(field, event);
libraryPageKeyPressed(field, event);
}
public Object[] getChildren(TreeListDialogField field, Object element) {
@ -205,7 +207,6 @@ public class CPathLibraryEntryPage extends CPathBasePage {
// ---------- IDialogFieldListener --------
public void dialogFieldChanged(DialogField field) {
//libaryPageDialogFieldChanged(field);
}
}
@ -219,7 +220,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
libentries= openExtLibFileDialog(null);
break;
case IDX_ADD_CONTRIBUTED: /* add variable */
//libentries= openVariableSelectionDialog(null);
libentries= openContainerSelectionDialog(null);
break;
case IDX_EDIT: /* edit */
editEntry();
@ -246,6 +247,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
}
fLibrariesList.addElements(elementsToAdd);
fCPathList.addElements(elementsToAdd);
if (index == IDX_ADD_LIB) {
fLibrariesList.refresh();
}
@ -263,14 +265,14 @@ public class CPathLibraryEntryPage extends CPathBasePage {
}
}
protected void libaryPageDoubleClicked(TreeListDialogField field) {
protected void libraryPageDoubleClicked(TreeListDialogField field) {
List selection= fLibrariesList.getSelectedElements();
if (canEdit(selection)) {
editEntry();
}
}
protected void libaryPageKeyPressed(TreeListDialogField field, KeyEvent event) {
protected void libraryPageKeyPressed(TreeListDialogField field, KeyEvent event) {
if (field == fLibrariesList) {
if (event.character == SWT.DEL && event.stateMask == 0) {
List selection= field.getSelectedElements();
@ -295,6 +297,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
fLibrariesList.refresh();
fCPathList.dialogFieldChanged(); // validate
} else {
fCPathList.removeElements(selElements);
fLibrariesList.removeElements(selElements);
}
}
@ -336,35 +339,27 @@ public class CPathLibraryEntryPage extends CPathBasePage {
}
private void editAttributeEntry(CPElementAttribute elem) {
//String key= elem.getKey();
//if (key.equals(CPElement.SOURCEATTACHMENT)) {
// CPElement selElement= elem.getParent();
// IPath containerPath= null;
// boolean applyChanges= false;
// Object parentContainer= selElement.getParentContainer();
// if (parentContainer instanceof CPElement) {
// containerPath= ((CPElement) parentContainer).getPath();
// applyChanges= true;
// }
// SourceAttachmentDialog dialog= new SourceAttachmentDialog(getShell(), selElement.getPathEntry(), containerPath, fCurrCProject, applyChanges);
// if (dialog.open() == Window.OK) {
// selElement.setAttribute(CPElement.SOURCEATTACHMENT, dialog.getSourceAttachmentPath());
// fLibrariesList.refresh();
// fCPathList.refresh(); // images
// }
//}
String key= elem.getKey();
if (key.equals(CPElement.SOURCEATTACHMENT)) {
CPElement selElement= elem.getParent();
ILibraryEntry libEntry = (ILibraryEntry)selElement.getPathEntry();
SourceAttachmentDialog dialog= new SourceAttachmentDialog(getShell(), libEntry, fCurrCProject, true);
if (dialog.open() == Window.OK) {
selElement.setAttribute(CPElement.SOURCEATTACHMENT, dialog.getSourceAttachmentPath());
fLibrariesList.refresh();
fCPathList.refresh(); // images
}
}
}
private void editElementEntry(CPElement elem) {
CPElement[] res= null;
switch (elem.getEntryKind()) {
case IPathEntry.CDT_LIBRARY:
IResource resource= elem.getResource();
if (resource == null) {
IPath p = (IPath)elem.getAttribute(CPElement.LIBRARY);
if (p.isAbsolute()) {
res= openExtLibFileDialog(elem);
} else if (resource.getType() == IResource.FILE) {
} else {
res= openLibFileDialog(elem);
}
break;
@ -382,20 +377,20 @@ public class CPathLibraryEntryPage extends CPathBasePage {
fLibrariesList.enableButton(IDX_REMOVE, canRemove(selElements));
}
//private IFile[] getUsedLibFiles(CPElement existing) {
// List res= new ArrayList();
// List cplist= fLibrariesList.getElements();
// for (int i= 0; i < cplist.size(); i++) {
// CPElement elem= (CPElement)cplist.get(i);
// if (elem.getEntryKind() == IPathEntry.CDT_LIBRARY && (elem != existing)) {
// IResource resource= elem.getResource();
// if (resource instanceof IFile) {
// res.add(resource);
// }
// }
// }
// return (IFile[]) res.toArray(new IFile[res.size()]);
//}
private IFile[] getUsedLibFiles(CPElement existing) {
List res= new ArrayList();
List cplist= fLibrariesList.getElements();
for (int i= 0; i < cplist.size(); i++) {
CPElement elem= (CPElement)cplist.get(i);
if (elem.getEntryKind() == IPathEntry.CDT_LIBRARY && (elem != existing)) {
IResource resource= elem.getResource();
if (resource instanceof IFile) {
res.add(resource);
}
}
}
return (IFile[]) res.toArray(new IFile[res.size()]);
}
private CPElement newCPLibraryElement(IPath libraryPath) {
CPElement element = new CPElement(fCurrCProject, IPathEntry.CDT_LIBRARY, fProjPath, null);
@ -435,7 +430,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
private CPElement[] openLibFileDialog(CPElement existing) {
Class[] acceptedClasses= new Class[] { IFile.class };
TypedElementSelectionValidator validator= new TypedElementSelectionValidator(acceptedClasses, existing == null);
//ViewerFilter filter= new ArchiveFileFilter(getUsedJARFiles(existing), true);
ViewerFilter filter= new ArchiveFileFilter(getUsedLibFiles(existing), true);
ILabelProvider lp= new WorkbenchLabelProvider();
ITreeContentProvider cp= new WorkbenchContentProvider();
@ -447,7 +442,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
dialog.setValidator(validator);
dialog.setTitle(title);
dialog.setMessage(message);
//dialog.addFilter(filter);
dialog.addFilter(filter);
dialog.setInput(fWorkspaceRoot);
dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
if (existing == null) {
@ -467,6 +462,45 @@ public class CPathLibraryEntryPage extends CPathBasePage {
}
return null;
}
protected IPathEntry[] getRawPathEntries() {
IPathEntry[] currEntries = new IPathEntry[fCPathList.getSize()];
for (int i = 0; i < currEntries.length; i++) {
CPElement curr = (CPElement) fCPathList.getElement(i);
currEntries[i] = curr.getPathEntry();
}
return currEntries;
}
protected CPElement[] openContainerSelectionDialog(CPElement existing) {
IPathEntry elem = null;
String title;
if (existing == null) {
title = CPathEntryMessages.getString("LibrariesEntryPage.ContainerDialog.new.title"); //$NON-NLS-1$
} else {
title = CPathEntryMessages.getString("LibrariesEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
elem = existing.getPathEntry();
}
CPathContainerWizard wizard = new CPathContainerWizard(elem, null, fCurrCProject, getRawPathEntries(),
IPathEntry.CDT_LIBRARY);
wizard.setWindowTitle(title);
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {
IPathEntry parent = wizard.getEntriesParent();
IPathEntry[] elements = wizard.getEntries();
if (elements != null) {
CPElement[] res = new CPElement[elements.length];
for (int i = 0; i < res.length; i++) {
res[i] = new CPElement(fCurrCProject, IPathEntry.CDT_LIBRARY, fProjPath, null);
res[i].setAttribute(CPElement.LIBRARY, ((ILibraryEntry)elements[i]).getLibraryPath());
res[i].setAttribute(CPElement.BASE_REF, parent.getPath());
}
return res;
}
}
return null;
}
private boolean canEdit(List selElements) {
if (selElements.size() != 1) {
return false;

View file

@ -156,7 +156,7 @@ public class CPathSymbolEntryPage extends ExtendedCPathBasePage {
title = CPathEntryMessages.getString("SymbolEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
elem = existing.getPathEntry();
}
CPathContainerWizard wizard = new CPathContainerWizard(elem, null, (ICElement)getSelection().get(0), getRawClasspath(),
CPathContainerWizard wizard = new CPathContainerWizard(elem, null, (ICElement)getSelection().get(0), getRawPathEntries(),
IPathEntry.CDT_MACRO);
wizard.setWindowTitle(title);
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {

View file

@ -268,7 +268,7 @@ public abstract class ExtendedCPathBasePage extends CPathBasePage {
return fCPathList;
}
protected IPathEntry[] getRawClasspath() {
protected IPathEntry[] getRawPathEntries() {
IPathEntry[] currEntries = new IPathEntry[fCPathList.size()];
for (int i = 0; i < currEntries.length; i++) {
CPElement curr = (CPElement) fCPathList.get(i);

View file

@ -0,0 +1,107 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
import org.eclipse.core.resources.IContainer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.NewFolderDialog;
import org.eclipse.ui.views.navigator.ResourceSorter;
/**
*/
public class FolderSelectionDialog extends ElementTreeSelectionDialog implements ISelectionChangedListener {
private Button fNewFolderButton;
private IContainer fSelectedContainer;
public FolderSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
super(parent, labelProvider, contentProvider);
setSorter(new ResourceSorter(ResourceSorter.NAME));
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite result= (Composite)super.createDialogArea(parent);
getTreeViewer().addSelectionChangedListener(this);
Button button = new Button(result, SWT.PUSH);
button.setText(CPathEntryMessages.getString("FolderSelectionDialog.button")); //$NON-NLS-1$
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
newFolderButtonPressed();
}
});
button.setFont(parent.getFont());
GridData data= new GridData();
data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
button.setLayoutData(data);
fNewFolderButton= button;
applyDialogFont(result);
return result;
}
private void updateNewFolderButtonState() {
IStructuredSelection selection= (IStructuredSelection) getTreeViewer().getSelection();
fSelectedContainer= null;
if (selection.size() == 1) {
Object first= selection.getFirstElement();
if (first instanceof IContainer) {
fSelectedContainer= (IContainer) first;
}
}
fNewFolderButton.setEnabled(fSelectedContainer != null);
}
protected void newFolderButtonPressed() {
NewFolderDialog dialog= new NewFolderDialog(getShell(), fSelectedContainer);
if (dialog.open() == Window.OK) {
TreeViewer treeViewer= getTreeViewer();
treeViewer.refresh(fSelectedContainer);
Object createdFolder= dialog.getResult()[0];
treeViewer.reveal(createdFolder);
treeViewer.setSelection(new StructuredSelection(createdFolder));
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
updateNewFolderButtonState();
}
}

View file

@ -0,0 +1,483 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILibraryEntry;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.internal.corext.Assert;
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.dialogs.StatusUtil;
import org.eclipse.cdt.internal.ui.util.PixelConverter;
import org.eclipse.cdt.internal.ui.wizards.TypedElementSelectionValidator;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
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.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* UI to set the source attachment archive and root.
* Same implementation for both setting attachments for libraries from
* variable entries and for normal (internal or external) jar.
*
* SourceAttachmentBlock
*/
public class SourceAttachmentBlock {
private IStatusChangeListener fContext;
private StringButtonDialogField fFileNameField;
private SelectionButtonDialogField fWorkspaceButton;
private SelectionButtonDialogField fExternalFolderButton;
private IStatus fNameStatus;
private IWorkspaceRoot fWorkspaceRoot;
private Control fSWTWidget;
private CLabel fFullPathResolvedLabel;
private ICProject fProject;
private ILibraryEntry fEntry;
/**
* @deprecated
*/
public SourceAttachmentBlock(IWorkspaceRoot root, IStatusChangeListener context, ILibraryEntry oldEntry) {
this(context, oldEntry, null);
}
/**
* @param context listeners for status updates
* @param entry The entry to edit
* @param containerPath Path of the container that contains the given entry or
* <code>null</code> if the entry does not belong to a container.
* @param project Project to which the entry belongs. Can be
* <code>null</code> if <code>getRunnable</code> is not run and the entry
* does not belong to a container.
*
*/
public SourceAttachmentBlock(IStatusChangeListener context, ILibraryEntry entry, ICProject project) {
Assert.isNotNull(entry);
fContext= context;
fEntry= entry;
fProject= project;
fWorkspaceRoot= ResourcesPlugin.getWorkspace().getRoot();
fNameStatus= new StatusInfo();
SourceAttachmentAdapter adapter= new SourceAttachmentAdapter();
fFileNameField= new StringButtonDialogField(adapter);
fFileNameField.setDialogFieldListener(adapter);
fFileNameField.setLabelText(CPathEntryMessages.getString("SourceAttachmentBlock.filename.label")); //$NON-NLS-1$
fFileNameField.setButtonLabel(CPathEntryMessages.getString("SourceAttachmentBlock.filename.externalfile.button")); //$NON-NLS-1$
fWorkspaceButton= new SelectionButtonDialogField(SWT.PUSH);
fWorkspaceButton.setDialogFieldListener(adapter);
fWorkspaceButton.setLabelText(CPathEntryMessages.getString("SourceAttachmentBlock.filename.internal.button")); //$NON-NLS-1$
fExternalFolderButton= new SelectionButtonDialogField(SWT.PUSH);
fExternalFolderButton.setDialogFieldListener(adapter);
fExternalFolderButton.setLabelText(CPathEntryMessages.getString("SourceAttachmentBlock.filename.externalfolder.button")); //$NON-NLS-1$
// set the old settings
setDefaults();
}
public void setDefaults() {
if (fEntry.getSourceAttachmentPath() != null) {
fFileNameField.setText(fEntry.getSourceAttachmentPath().toString());
} else {
fFileNameField.setText(""); //$NON-NLS-1$
}
}
/**
* Gets the source attachment path chosen by the user
*/
public IPath getSourceAttachmentPath() {
if (fFileNameField.getText().length() == 0) {
return null;
}
return new Path(fFileNameField.getText());
}
/**
* Gets the source attachment root chosen by the user
* Returns null to let JCore automatically detect the root.
*/
public IPath getSourceAttachmentRootPath() {
return null;
}
/**
* Null for now
* @return
*/
public IPath getSourceAttachmentPrefixMapping() {
return null;
}
/**
* Creates the control
*/
public Control createControl(Composite parent) {
PixelConverter converter= new PixelConverter(parent);
fSWTWidget= parent;
Composite composite= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
layout.numColumns= 4;
composite.setLayout(layout);
int widthHint= converter.convertWidthInCharsToPixels(60);
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= 3;
Label message= new Label(composite, SWT.LEFT);
message.setLayoutData(gd);
message.setText(CPathEntryMessages.getFormattedString("SourceAttachmentBlock.message", fEntry.getLibraryPath().lastSegment())); //$NON-NLS-1$
fWorkspaceButton.doFillIntoGrid(composite, 1);
// archive name field
fFileNameField.doFillIntoGrid(composite, 4);
LayoutUtil.setWidthHint(fFileNameField.getTextControl(null), widthHint);
LayoutUtil.setHorizontalGrabbing(fFileNameField.getTextControl(null));
// aditional 'browse workspace' button for normal jars
DialogField.createEmptySpace(composite, 3);
fExternalFolderButton.doFillIntoGrid(composite, 1);
fFileNameField.postSetFocusOnDialogField(parent.getDisplay());
Dialog.applyDialogFont(composite);
//WorkbenchHelp.setHelp(composite, IJavaHelpContextIds.SOURCE_ATTACHMENT_BLOCK);
return composite;
}
private class SourceAttachmentAdapter implements IStringButtonAdapter, IDialogFieldListener {
// -------- IStringButtonAdapter --------
public void changeControlPressed(DialogField field) {
attachmentChangeControlPressed(field);
}
// ---------- IDialogFieldListener --------
public void dialogFieldChanged(DialogField field) {
attachmentDialogFieldChanged(field);
}
}
private void attachmentChangeControlPressed(DialogField field) {
if (field == fFileNameField) {
IPath jarFilePath= chooseExtJarFile();
if (jarFilePath != null) {
fFileNameField.setText(jarFilePath.toString());
}
}
}
// ---------- IDialogFieldListener --------
private void attachmentDialogFieldChanged(DialogField field) {
if (field == fFileNameField) {
fNameStatus= updateFileNameStatus();
} else if (field == fWorkspaceButton) {
IPath jarFilePath= chooseInternalJarFile();
if (jarFilePath != null) {
fFileNameField.setText(jarFilePath.toString());
}
return;
} else if (field == fExternalFolderButton) {
IPath folderPath= chooseExtFolder();
if (folderPath != null) {
fFileNameField.setText(folderPath.toString());
}
return;
}
doStatusLineUpdate();
}
private void doStatusLineUpdate() {
fFileNameField.enableButton(canBrowseFileName());
// set the resolved path for variable jars
if (fFullPathResolvedLabel != null) {
fFullPathResolvedLabel.setText(getResolvedLabelString(fFileNameField.getText(), true));
}
IStatus status= StatusUtil.getMostSevere(new IStatus[] { fNameStatus });
fContext.statusChanged(status);
}
private boolean canBrowseFileName() {
return true;
}
private String getResolvedLabelString(String path, boolean osPath) {
IPath resolvedPath= getResolvedPath(new Path(path));
if (resolvedPath != null) {
if (osPath) {
return resolvedPath.toOSString();
} else {
return resolvedPath.toString();
}
}
return ""; //$NON-NLS-1$
}
/*
* Do substitution here
*/
private IPath getResolvedPath(IPath path) {
return path;
}
private IStatus updateFileNameStatus() {
StatusInfo status= new StatusInfo();
String fileName= fFileNameField.getText();
if (fileName.length() == 0) {
// no source attachment
return status;
} else {
if (!Path.EMPTY.isValidPath(fileName)) {
status.setError(CPathEntryMessages.getString("SourceAttachmentBlock.filename.error.notvalid")); //$NON-NLS-1$
return status;
}
IPath filePath= new Path(fileName);
File file= filePath.toFile();
IResource res= fWorkspaceRoot.findMember(filePath);
if (res != null && res.getLocation() != null) {
file= res.getLocation().toFile();
}
if (!file.exists()) {
String message= CPathEntryMessages.getFormattedString("SourceAttachmentBlock.filename.error.filenotexists", filePath.toString()); //$NON-NLS-1$
status.setError(message);
return status;
}
}
return status;
}
/*
* Opens a dialog to choose a jar from the file system.
*/
private IPath chooseExtJarFile() {
IPath currPath= new Path(fFileNameField.getText());
if (currPath.isEmpty()) {
currPath= fEntry.getPath();
}
if (ArchiveFileFilter.isArchivePath(currPath)) {
currPath= currPath.removeLastSegments(1);
}
FileDialog dialog= new FileDialog(getShell());
dialog.setText(CPathEntryMessages.getString("SourceAttachmentBlock.extjardialog.text")); //$NON-NLS-1$
dialog.setFilterExtensions(new String[] {"*.jar;*.zip"}); //$NON-NLS-1$
dialog.setFilterPath(currPath.toOSString());
String res= dialog.open();
if (res != null) {
return new Path(res).makeAbsolute();
}
return null;
}
private IPath chooseExtFolder() {
IPath currPath= new Path(fFileNameField.getText());
if (currPath.isEmpty()) {
currPath= fEntry.getPath();
}
if (ArchiveFileFilter.isArchivePath(currPath)) {
currPath= currPath.removeLastSegments(1);
}
DirectoryDialog dialog= new DirectoryDialog(getShell());
dialog.setText(CPathEntryMessages.getString("SourceAttachmentBlock.extfolderdialog.text")); //$NON-NLS-1$
dialog.setFilterPath(currPath.toOSString());
String res= dialog.open();
if (res != null) {
return new Path(res).makeAbsolute();
}
return null;
}
/*
* Opens a dialog to choose an internal jar.
*/
private IPath chooseInternalJarFile() {
String initSelection= fFileNameField.getText();
Class[] acceptedClasses= new Class[] { IFolder.class, IFile.class };
TypedElementSelectionValidator validator= new TypedElementSelectionValidator(acceptedClasses, false);
ViewerFilter filter= new ArchiveFileFilter(null, false);
ILabelProvider lp= new WorkbenchLabelProvider();
ITreeContentProvider cp= new WorkbenchContentProvider();
IResource initSel= null;
if (initSelection.length() > 0) {
initSel= fWorkspaceRoot.findMember(new Path(initSelection));
}
if (initSel == null) {
initSel= fWorkspaceRoot.findMember(fEntry.getPath());
}
FolderSelectionDialog dialog= new FolderSelectionDialog(getShell(), lp, cp);
dialog.setAllowMultiple(false);
dialog.setValidator(validator);
dialog.addFilter(filter);
dialog.setTitle(CPathEntryMessages.getString("SourceAttachmentBlock.intjardialog.title")); //$NON-NLS-1$
dialog.setMessage(CPathEntryMessages.getString("SourceAttachmentBlock.intjardialog.message")); //$NON-NLS-1$
dialog.setInput(fWorkspaceRoot);
dialog.setInitialSelection(initSel);
if (dialog.open() == Window.OK) {
IResource res= (IResource) dialog.getFirstResult();
return res.getFullPath();
}
return null;
}
private Shell getShell() {
if (fSWTWidget != null) {
return fSWTWidget.getShell();
}
return CUIPlugin.getActiveWorkbenchShell();
}
/**
* Creates a runnable that sets the source attachment by modifying the project's classpath.
*/
public IRunnableWithProgress getRunnable(final ICProject jproject, final Shell shell) {
fProject= jproject;
return getRunnable(shell);
}
/**
* Creates a runnable that sets the source attachment by modifying the
* project's classpath or updating a container.
*/
public IRunnableWithProgress getRunnable(final Shell shell) {
return new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
attachSource(shell, monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
};
}
protected void attachSource(final Shell shell, IProgressMonitor monitor) throws CoreException {
boolean isExported= fEntry.isExported();
ILibraryEntry newEntry;
newEntry= CoreModel.newLibraryEntry(fEntry.getPath(), fEntry.getBasePath(), fEntry.getLibraryPath(),
getSourceAttachmentPath(), getSourceAttachmentRootPath(), getSourceAttachmentPrefixMapping(), isExported);
updateProjectPathEntry(shell, fProject, newEntry, monitor);
}
private void updateProjectPathEntry(Shell shell, ICProject cproject, ILibraryEntry newEntry, IProgressMonitor monitor) throws CModelException {
IPathEntry[] oldClasspath= cproject.getRawPathEntries();
int nEntries= oldClasspath.length;
ArrayList newEntries= new ArrayList(nEntries + 1);
int entryKind= newEntry.getEntryKind();
IPath jarPath= newEntry.getPath();
boolean found= false;
for (int i= 0; i < nEntries; i++) {
IPathEntry curr= oldClasspath[i];
if (curr.getEntryKind() == entryKind && curr.getPath().equals(jarPath)) {
// add modified entry
newEntries.add(newEntry);
found= true;
} else {
newEntries.add(curr);
}
}
if (!found) {
if (newEntry.getSourceAttachmentPath() == null || !putJarOnClasspathDialog(shell)) {
return;
}
// add new
newEntries.add(newEntry);
}
IPathEntry[] newPathEntries= (IPathEntry[]) newEntries.toArray(new IPathEntry[newEntries.size()]);
cproject.setRawPathEntries(newPathEntries, monitor);
}
private boolean putJarOnClasspathDialog(Shell shell) {
final boolean[] result= new boolean[1];
shell.getDisplay().syncExec(new Runnable() {
public void run() {
String title= CPathEntryMessages.getString("SourceAttachmentBlock.putoncpdialog.title"); //$NON-NLS-1$
String message= CPathEntryMessages.getString("SourceAttachmentBlock.putoncpdialog.message"); //$NON-NLS-1$
result[0]= MessageDialog.openQuestion(CUIPlugin.getActiveWorkbenchShell(), title, message);
}
});
return result[0];
}
}

View file

@ -0,0 +1,175 @@
/**********************************************************************
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ILibraryEntry;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
import org.eclipse.cdt.internal.ui.dialogs.StatusDialog;
import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* A dialog to configure the source attachment of a library (library and zip archive).
*
* SourceAttachmentDialog
*/
public class SourceAttachmentDialog extends StatusDialog {
private SourceAttachmentBlock fSourceAttachmentBlock;
private boolean fApplyChanges;
/**
* Creates an instance of the SourceAttachmentDialog. After
* <code>open</code>, the edited paths can be access with
* <code>getSourceAttachmentPath</code> and
* <code>getSourceAttachmentRootPath</code>.
* @param parent Parent shell for the dialog
* @param entry The entry to edit
* @param containerPath Path of the container that contains the given entry or
* <code>null</code> if the entry does not belong to a container.
* @param project Project to which the entry belongs. Can be
* <code>null</code> if <code>applyChanges</code> is false and the entry
* does not belong to a container.
* @param applyChanges If set to <code>true</code>, changes are applied on
* OK. If set to false, no changes are commited. When changes are applied,
* classpath entries which are not found on the classpath will be added as
* new libraries.
*/
public SourceAttachmentDialog(Shell parent, ILibraryEntry entry, ICProject project, boolean applyChanges) {
super(parent);
fApplyChanges= applyChanges;
IStatusChangeListener listener= new IStatusChangeListener() {
public void statusChanged(IStatus status) {
updateStatus(status);
}
};
fSourceAttachmentBlock= new SourceAttachmentBlock(listener, entry, project);
setTitle(CPathEntryMessages.getString("SourceAttachmentDialog.title")); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
//WorkbenchHelp.setHelp(newShell, IJavaHelpContextIds.SOURCE_ATTACHMENT_DIALOG);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite composite= (Composite) super.createDialogArea(parent);
Control inner= createSourceAttachmentControls(composite);
inner.setLayoutData(new GridData(GridData.FILL_BOTH));
applyDialogFont(composite);
return composite;
}
/**
* Creates the controls for the source attachment configuration.
*/
protected Control createSourceAttachmentControls(Composite composite) {
return fSourceAttachmentBlock.createControl(composite);
}
/**
* Returns the configured source attachment path.
*/
public IPath getSourceAttachmentPath() {
return fSourceAttachmentBlock.getSourceAttachmentPath();
}
/**
* Returns the configured source attachment path root. Sonce 2.1 source
* attachment roots are autodetected. The value returned is therefore always
* null.
*/
public IPath getSourceAttachmentRootPath() {
return fSourceAttachmentBlock.getSourceAttachmentRootPath();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
super.okPressed();
if (fApplyChanges) {
try {
IRunnableWithProgress runnable= getRunnable();
new ProgressMonitorDialog(getShell()).run(true, true, runnable);
} catch (InvocationTargetException e) {
String title= CPathEntryMessages.getString("SourceAttachmentDialog.error.title"); //$NON-NLS-1$
String message= CPathEntryMessages.getString("SourceAttachmentDialog.error.message"); //$NON-NLS-1$
ExceptionHandler.handle(e, getShell(), title, message);
} catch (InterruptedException e) {
// cancelled
}
}
}
/**
* Creates the runnable that configures the project with the new source
* attachements.
*/
protected IRunnableWithProgress getRunnable() {
return fSourceAttachmentBlock.getRunnable(getShell());
}
/**
* Helper method that tests if an classpath entry can be found in a
* container. <code>null</code> is returned if the entry can not be found
* or if the container does not allows the configuration of source
* attachments
* @param jproject The container's parent project
* @param containerPath The path of the container
* @param libPath The path of the bibrary to be found
* @return IClasspathEntry A classpath entry from the container of
* <code>null</code> if the container can not be modified.
*/
public static IPathEntry getPathEntryToEdit(ICProject jproject, IPath containerPath, IPath libPath) throws CModelException {
//IPathEntryContainer container= CoreModel.getPathEntryContainer(containerPath, jproject);
//PathEntryContainerInitializer initializer= CoreModel.getPathEntryContainerInitializer(containerPath.segment(0));
//if (container != null && initializer != null && initializer.canUpdateClasspathContainer(containerPath, jproject)) {
// IPathEntry[] entries= container.getPathEntries();
// for (int i= 0; i < entries.length; i++) {
// IPathEntry curr= entries[i];
// IPathEntry resolved= CoreModel.getResolvedPathEntry(curr);
// if (resolved != null && libPath.equals(resolved.getPath())) {
// return curr; // return the real entry
// }
// }
//}
return null; // attachment not possible
}
}