mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 18:26:01 +02:00
More support for Libaryentry
This commit is contained in:
parent
2c9b2f90fa
commit
dd52df1494
10 changed files with 987 additions and 48 deletions
|
@ -173,7 +173,7 @@ public class CProject extends Openable implements ICProject {
|
||||||
for (int i = 0; i < binConfigs.length; i++) {
|
for (int i = 0; i < binConfigs.length; i++) {
|
||||||
IBinaryFile bin;
|
IBinaryFile bin;
|
||||||
try {
|
try {
|
||||||
bin = binConfigs[i].getBinaryParser().getBinary(entry.getPath());
|
bin = binConfigs[i].getBinaryParser().getBinary(entry.getFullLibraryPath());
|
||||||
if (bin != null) {
|
if (bin != null) {
|
||||||
if (bin.getType() == IBinaryFile.ARCHIVE) {
|
if (bin.getType() == IBinaryFile.ARCHIVE) {
|
||||||
lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin);
|
lib = new LibraryReferenceArchive(cproject, entry, (IBinaryArchive)bin);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -159,6 +159,9 @@ LibrariesEntryPage.libraries.addcontriblib.button=Add &Contributed...
|
||||||
LibrariesEntryPage.libraries.addworkspacelib.button=Add from Workspace...
|
LibrariesEntryPage.libraries.addworkspacelib.button=Add from Workspace...
|
||||||
LibrariesEntryPage.libraries.edit.button=&Edit...
|
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.title=Class Folder Selection
|
||||||
LibrariesWorkbookPage.ExistingClassFolderDialog.new.description=&Choose class folders to be added to the build path:
|
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...
|
FolderSelectionDialog.button=Create &New Folder...
|
||||||
MultipleFolderSelectionDialog.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.
|
||||||
|
|
|
@ -219,7 +219,7 @@ public class CPathIncludeEntryPage extends ExtendedCPathBasePage {
|
||||||
title = CPathEntryMessages.getString("IncludeEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
|
title = CPathEntryMessages.getString("IncludeEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
|
||||||
elem = existing.getPathEntry();
|
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);
|
IPathEntry.CDT_INCLUDE);
|
||||||
wizard.setWindowTitle(title);
|
wizard.setWindowTitle(title);
|
||||||
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {
|
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
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.core.model.IPathEntry;
|
||||||
import org.eclipse.cdt.internal.ui.CPluginImages;
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
import org.eclipse.cdt.internal.ui.util.PixelConverter;
|
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.ILabelProvider;
|
||||||
import org.eclipse.jface.viewers.ITreeContentProvider;
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||||
import org.eclipse.jface.viewers.StructuredSelection;
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.ViewerFilter;
|
||||||
import org.eclipse.jface.window.Window;
|
import org.eclipse.jface.window.Window;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.events.KeyEvent;
|
import org.eclipse.swt.events.KeyEvent;
|
||||||
|
@ -177,11 +179,11 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doubleClicked(TreeListDialogField field) {
|
public void doubleClicked(TreeListDialogField field) {
|
||||||
//libraryPageDoubleClicked(field);
|
libraryPageDoubleClicked(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyPressed(TreeListDialogField field, KeyEvent event) {
|
public void keyPressed(TreeListDialogField field, KeyEvent event) {
|
||||||
//libraryPageKeyPressed(field, event);
|
libraryPageKeyPressed(field, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object[] getChildren(TreeListDialogField field, Object element) {
|
public Object[] getChildren(TreeListDialogField field, Object element) {
|
||||||
|
@ -205,7 +207,6 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
// ---------- IDialogFieldListener --------
|
// ---------- IDialogFieldListener --------
|
||||||
|
|
||||||
public void dialogFieldChanged(DialogField field) {
|
public void dialogFieldChanged(DialogField field) {
|
||||||
//libaryPageDialogFieldChanged(field);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +220,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
libentries= openExtLibFileDialog(null);
|
libentries= openExtLibFileDialog(null);
|
||||||
break;
|
break;
|
||||||
case IDX_ADD_CONTRIBUTED: /* add variable */
|
case IDX_ADD_CONTRIBUTED: /* add variable */
|
||||||
//libentries= openVariableSelectionDialog(null);
|
libentries= openContainerSelectionDialog(null);
|
||||||
break;
|
break;
|
||||||
case IDX_EDIT: /* edit */
|
case IDX_EDIT: /* edit */
|
||||||
editEntry();
|
editEntry();
|
||||||
|
@ -246,6 +247,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
}
|
}
|
||||||
|
|
||||||
fLibrariesList.addElements(elementsToAdd);
|
fLibrariesList.addElements(elementsToAdd);
|
||||||
|
fCPathList.addElements(elementsToAdd);
|
||||||
if (index == IDX_ADD_LIB) {
|
if (index == IDX_ADD_LIB) {
|
||||||
fLibrariesList.refresh();
|
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();
|
List selection= fLibrariesList.getSelectedElements();
|
||||||
if (canEdit(selection)) {
|
if (canEdit(selection)) {
|
||||||
editEntry();
|
editEntry();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void libaryPageKeyPressed(TreeListDialogField field, KeyEvent event) {
|
protected void libraryPageKeyPressed(TreeListDialogField field, KeyEvent event) {
|
||||||
if (field == fLibrariesList) {
|
if (field == fLibrariesList) {
|
||||||
if (event.character == SWT.DEL && event.stateMask == 0) {
|
if (event.character == SWT.DEL && event.stateMask == 0) {
|
||||||
List selection= field.getSelectedElements();
|
List selection= field.getSelectedElements();
|
||||||
|
@ -295,6 +297,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
fLibrariesList.refresh();
|
fLibrariesList.refresh();
|
||||||
fCPathList.dialogFieldChanged(); // validate
|
fCPathList.dialogFieldChanged(); // validate
|
||||||
} else {
|
} else {
|
||||||
|
fCPathList.removeElements(selElements);
|
||||||
fLibrariesList.removeElements(selElements);
|
fLibrariesList.removeElements(selElements);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -336,35 +339,27 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void editAttributeEntry(CPElementAttribute elem) {
|
private void editAttributeEntry(CPElementAttribute elem) {
|
||||||
//String key= elem.getKey();
|
String key= elem.getKey();
|
||||||
//if (key.equals(CPElement.SOURCEATTACHMENT)) {
|
if (key.equals(CPElement.SOURCEATTACHMENT)) {
|
||||||
// CPElement selElement= elem.getParent();
|
CPElement selElement= elem.getParent();
|
||||||
|
ILibraryEntry libEntry = (ILibraryEntry)selElement.getPathEntry();
|
||||||
// IPath containerPath= null;
|
SourceAttachmentDialog dialog= new SourceAttachmentDialog(getShell(), libEntry, fCurrCProject, true);
|
||||||
// boolean applyChanges= false;
|
if (dialog.open() == Window.OK) {
|
||||||
// Object parentContainer= selElement.getParentContainer();
|
selElement.setAttribute(CPElement.SOURCEATTACHMENT, dialog.getSourceAttachmentPath());
|
||||||
// if (parentContainer instanceof CPElement) {
|
fLibrariesList.refresh();
|
||||||
// containerPath= ((CPElement) parentContainer).getPath();
|
fCPathList.refresh(); // images
|
||||||
// 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
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void editElementEntry(CPElement elem) {
|
private void editElementEntry(CPElement elem) {
|
||||||
CPElement[] res= null;
|
CPElement[] res= null;
|
||||||
|
|
||||||
switch (elem.getEntryKind()) {
|
switch (elem.getEntryKind()) {
|
||||||
case IPathEntry.CDT_LIBRARY:
|
case IPathEntry.CDT_LIBRARY:
|
||||||
IResource resource= elem.getResource();
|
IPath p = (IPath)elem.getAttribute(CPElement.LIBRARY);
|
||||||
if (resource == null) {
|
if (p.isAbsolute()) {
|
||||||
res= openExtLibFileDialog(elem);
|
res= openExtLibFileDialog(elem);
|
||||||
} else if (resource.getType() == IResource.FILE) {
|
} else {
|
||||||
res= openLibFileDialog(elem);
|
res= openLibFileDialog(elem);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -382,20 +377,20 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
fLibrariesList.enableButton(IDX_REMOVE, canRemove(selElements));
|
fLibrariesList.enableButton(IDX_REMOVE, canRemove(selElements));
|
||||||
}
|
}
|
||||||
|
|
||||||
//private IFile[] getUsedLibFiles(CPElement existing) {
|
private IFile[] getUsedLibFiles(CPElement existing) {
|
||||||
// List res= new ArrayList();
|
List res= new ArrayList();
|
||||||
// List cplist= fLibrariesList.getElements();
|
List cplist= fLibrariesList.getElements();
|
||||||
// for (int i= 0; i < cplist.size(); i++) {
|
for (int i= 0; i < cplist.size(); i++) {
|
||||||
// CPElement elem= (CPElement)cplist.get(i);
|
CPElement elem= (CPElement)cplist.get(i);
|
||||||
// if (elem.getEntryKind() == IPathEntry.CDT_LIBRARY && (elem != existing)) {
|
if (elem.getEntryKind() == IPathEntry.CDT_LIBRARY && (elem != existing)) {
|
||||||
// IResource resource= elem.getResource();
|
IResource resource= elem.getResource();
|
||||||
// if (resource instanceof IFile) {
|
if (resource instanceof IFile) {
|
||||||
// res.add(resource);
|
res.add(resource);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// return (IFile[]) res.toArray(new IFile[res.size()]);
|
return (IFile[]) res.toArray(new IFile[res.size()]);
|
||||||
//}
|
}
|
||||||
|
|
||||||
private CPElement newCPLibraryElement(IPath libraryPath) {
|
private CPElement newCPLibraryElement(IPath libraryPath) {
|
||||||
CPElement element = new CPElement(fCurrCProject, IPathEntry.CDT_LIBRARY, fProjPath, null);
|
CPElement element = new CPElement(fCurrCProject, IPathEntry.CDT_LIBRARY, fProjPath, null);
|
||||||
|
@ -435,7 +430,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
private CPElement[] openLibFileDialog(CPElement existing) {
|
private CPElement[] openLibFileDialog(CPElement existing) {
|
||||||
Class[] acceptedClasses= new Class[] { IFile.class };
|
Class[] acceptedClasses= new Class[] { IFile.class };
|
||||||
TypedElementSelectionValidator validator= new TypedElementSelectionValidator(acceptedClasses, existing == null);
|
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();
|
ILabelProvider lp= new WorkbenchLabelProvider();
|
||||||
ITreeContentProvider cp= new WorkbenchContentProvider();
|
ITreeContentProvider cp= new WorkbenchContentProvider();
|
||||||
|
@ -447,7 +442,7 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
dialog.setValidator(validator);
|
dialog.setValidator(validator);
|
||||||
dialog.setTitle(title);
|
dialog.setTitle(title);
|
||||||
dialog.setMessage(message);
|
dialog.setMessage(message);
|
||||||
//dialog.addFilter(filter);
|
dialog.addFilter(filter);
|
||||||
dialog.setInput(fWorkspaceRoot);
|
dialog.setInput(fWorkspaceRoot);
|
||||||
dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
|
dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
|
@ -467,6 +462,45 @@ public class CPathLibraryEntryPage extends CPathBasePage {
|
||||||
}
|
}
|
||||||
return null;
|
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) {
|
private boolean canEdit(List selElements) {
|
||||||
if (selElements.size() != 1) {
|
if (selElements.size() != 1) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -156,7 +156,7 @@ public class CPathSymbolEntryPage extends ExtendedCPathBasePage {
|
||||||
title = CPathEntryMessages.getString("SymbolEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
|
title = CPathEntryMessages.getString("SymbolEntryPage.ContainerDialog.edit.title"); //$NON-NLS-1$
|
||||||
elem = existing.getPathEntry();
|
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);
|
IPathEntry.CDT_MACRO);
|
||||||
wizard.setWindowTitle(title);
|
wizard.setWindowTitle(title);
|
||||||
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {
|
if (CPathContainerWizard.openWizard(getShell(), wizard) == Window.OK) {
|
||||||
|
|
|
@ -268,7 +268,7 @@ public abstract class ExtendedCPathBasePage extends CPathBasePage {
|
||||||
return fCPathList;
|
return fCPathList;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IPathEntry[] getRawClasspath() {
|
protected IPathEntry[] getRawPathEntries() {
|
||||||
IPathEntry[] currEntries = new IPathEntry[fCPathList.size()];
|
IPathEntry[] currEntries = new IPathEntry[fCPathList.size()];
|
||||||
for (int i = 0; i < currEntries.length; i++) {
|
for (int i = 0; i < currEntries.length; i++) {
|
||||||
CPElement curr = (CPElement) fCPathList.get(i);
|
CPElement curr = (CPElement) fCPathList.get(i);
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue