mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
work in progress on c path ui control - ui not enabled yet see plugin.xml
This commit is contained in:
parent
8b8959e099
commit
12a4c3d3df
34 changed files with 5501 additions and 1057 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2004-03-26 David Inglis
|
||||||
|
|
||||||
|
WORKING PROGRESS new C Path entry UI - Project property page to add/remove/reorder
|
||||||
|
src paths, output paths, project references and export/order.
|
||||||
|
UI not enabled yet
|
||||||
|
no many file to list here.....
|
||||||
|
|
||||||
|
|
||||||
2004-03-25 Hoda Amer
|
2004-03-25 Hoda Amer
|
||||||
Added the timeout capability for content assist.
|
Added the timeout capability for content assist.
|
||||||
Added a preference for the user to set up the timeout limit for content assist
|
Added a preference for the user to set up the timeout limit for content assist
|
||||||
|
|
BIN
core/org.eclipse.cdt.ui/icons/full/obj16/cp_order_obj.gif
Normal file
BIN
core/org.eclipse.cdt.ui/icons/full/obj16/cp_order_obj.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 89 B |
Binary file not shown.
After Width: | Height: | Size: 125 B |
|
@ -550,5 +550,21 @@
|
||||||
</description>
|
</description>
|
||||||
</fontDefinition>
|
</fontDefinition>
|
||||||
</extension>
|
</extension>
|
||||||
|
<!--
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.ui.propertyPages">
|
||||||
|
<page
|
||||||
|
adaptable="true"
|
||||||
|
objectClass="org.eclipse.core.resources.IProject"
|
||||||
|
name="C/C++ Project Paths"
|
||||||
|
class="org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathPropertyPage"
|
||||||
|
nameFilter="*"
|
||||||
|
id="org.eclipse.cdt.internal.ui.dialogs.cpath.CPathPropertyPage">
|
||||||
|
<filter
|
||||||
|
name="nature"
|
||||||
|
value="org.eclipse.cdt.core.cnature">
|
||||||
|
</filter>
|
||||||
|
</page>
|
||||||
|
</extension>
|
||||||
|
-->
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -20,7 +20,7 @@ import org.eclipse.swt.graphics.Image;
|
||||||
public class CPluginImages {
|
public class CPluginImages {
|
||||||
|
|
||||||
// The plugin registry
|
// The plugin registry
|
||||||
private static ImageRegistry imageRegistry = new ImageRegistry();
|
private static ImageRegistry imageRegistry = new ImageRegistry(CUIPlugin.getStandardDisplay());
|
||||||
|
|
||||||
// Subdirectory (under the package containing this class) where 16 color images are
|
// Subdirectory (under the package containing this class) where 16 color images are
|
||||||
private static URL fgIconBaseURL;
|
private static URL fgIconBaseURL;
|
||||||
|
@ -55,6 +55,7 @@ public class CPluginImages {
|
||||||
public static final String IMG_OBJS_FUNCTION= NAME_PREFIX + "function_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_FUNCTION= NAME_PREFIX + "function_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_PUBLIC_METHOD= NAME_PREFIX + "method_public_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_PUBLIC_METHOD= NAME_PREFIX + "method_public_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_PROTECTED_METHOD= NAME_PREFIX + "method_protected_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_PROTECTED_METHOD= NAME_PREFIX + "method_protected_obj.gif"; //$NON-NLS-1$
|
||||||
|
|
||||||
public static final String IMG_OBJS_PRIVATE_METHOD= NAME_PREFIX + "method_private_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_PRIVATE_METHOD= NAME_PREFIX + "method_private_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_PUBLIC_FIELD= NAME_PREFIX + "field_public_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_PUBLIC_FIELD= NAME_PREFIX + "field_public_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_PROTECTED_FIELD= NAME_PREFIX + "field_protected_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_PROTECTED_FIELD= NAME_PREFIX + "field_protected_obj.gif"; //$NON-NLS-1$
|
||||||
|
@ -67,7 +68,7 @@ public class CPluginImages {
|
||||||
public static final String IMG_OBJS_TUNIT_HEADER= NAME_PREFIX + "h_file_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_TUNIT_HEADER= NAME_PREFIX + "h_file_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_TUNIT_ASM= NAME_PREFIX + "s_file_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_TUNIT_ASM= NAME_PREFIX + "s_file_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_TUNIT_RESOURCE= NAME_PREFIX + "c_resource_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_TUNIT_RESOURCE= NAME_PREFIX + "c_resource_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_SOURCE_ROOT= NAME_PREFIX + "cfolder_obj.gif"; // $NON-NLS-1$
|
public static final String IMG_OBJS_SOURCE_ROOT= NAME_PREFIX + "cfolder_obj.gif"; // $NON-NLS-1$ //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_ARCHIVE= NAME_PREFIX + "ar_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_ARCHIVE= NAME_PREFIX + "ar_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_BINARY= NAME_PREFIX + "bin_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_BINARY= NAME_PREFIX + "bin_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_SHLIB= NAME_PREFIX + "shlib_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_SHLIB= NAME_PREFIX + "shlib_obj.gif"; //$NON-NLS-1$
|
||||||
|
@ -76,7 +77,10 @@ public class CPluginImages {
|
||||||
public static final String IMG_OBJS_CORE= NAME_PREFIX + "core_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_CORE= NAME_PREFIX + "core_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_CONTAINER= NAME_PREFIX + "container_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_CONTAINER= NAME_PREFIX + "container_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_LIBRARY= NAME_PREFIX + "lib_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_LIBRARY= NAME_PREFIX + "lib_obj.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_OBJS_ORDER= NAME_PREFIX + "cp_order_obj.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_OBJS_EXCLUDSION_FILTER_ATTRIB= NAME_PREFIX + "exclusion_filter_attrib.gif"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String IMG_OBJS_ARCHIVE_WSRC= NAME_PREFIX + "ar_src_obj.gif"; //$NON-NLS-1$
|
||||||
|
|
||||||
// Breakpoint images
|
// Breakpoint images
|
||||||
public static final String IMG_OBJS_BREAKPOINT = NAME_PREFIX + "breakpoint.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_BREAKPOINT = NAME_PREFIX + "breakpoint.gif"; //$NON-NLS-1$
|
||||||
|
@ -112,6 +116,7 @@ public class CPluginImages {
|
||||||
public static final ImageDescriptor DESC_OBJS_TUNIT_RESOURCE= createManaged(T_OBJ, IMG_OBJS_TUNIT_RESOURCE);
|
public static final ImageDescriptor DESC_OBJS_TUNIT_RESOURCE= createManaged(T_OBJ, IMG_OBJS_TUNIT_RESOURCE);
|
||||||
public static final ImageDescriptor DESC_OBJS_SOURCE_ROOT= createManaged(T_OBJ, IMG_OBJS_SOURCE_ROOT);
|
public static final ImageDescriptor DESC_OBJS_SOURCE_ROOT= createManaged(T_OBJ, IMG_OBJS_SOURCE_ROOT);
|
||||||
public static final ImageDescriptor DESC_OBJS_ARCHIVE= createManaged(T_OBJ, IMG_OBJS_ARCHIVE);
|
public static final ImageDescriptor DESC_OBJS_ARCHIVE= createManaged(T_OBJ, IMG_OBJS_ARCHIVE);
|
||||||
|
public static final ImageDescriptor DESC_OBJS_ARCHIVE_WSRC= createManaged(T_OBJ, IMG_OBJS_ARCHIVE);
|
||||||
public static final ImageDescriptor DESC_OBJS_BINARY= createManaged(T_OBJ, IMG_OBJS_BINARY);
|
public static final ImageDescriptor DESC_OBJS_BINARY= createManaged(T_OBJ, IMG_OBJS_BINARY);
|
||||||
public static final ImageDescriptor DESC_OBJS_SHLIB= createManaged(T_OBJ, IMG_OBJS_SHLIB);
|
public static final ImageDescriptor DESC_OBJS_SHLIB= createManaged(T_OBJ, IMG_OBJS_SHLIB);
|
||||||
public static final ImageDescriptor DESC_OBJS_CEXEC= createManaged(T_OBJ, IMG_OBJS_CEXEC);
|
public static final ImageDescriptor DESC_OBJS_CEXEC= createManaged(T_OBJ, IMG_OBJS_CEXEC);
|
||||||
|
@ -119,6 +124,8 @@ public class CPluginImages {
|
||||||
public static final ImageDescriptor DESC_OBJS_CORE= createManaged(T_OBJ, IMG_OBJS_CORE);
|
public static final ImageDescriptor DESC_OBJS_CORE= createManaged(T_OBJ, IMG_OBJS_CORE);
|
||||||
public static final ImageDescriptor DESC_OBJS_CONTAINER= createManaged(T_OBJ, IMG_OBJS_CONTAINER);
|
public static final ImageDescriptor DESC_OBJS_CONTAINER= createManaged(T_OBJ, IMG_OBJS_CONTAINER);
|
||||||
public static final ImageDescriptor DESC_OBJS_LIBRARY= createManaged(T_OBJ, IMG_OBJS_LIBRARY);
|
public static final ImageDescriptor DESC_OBJS_LIBRARY= createManaged(T_OBJ, IMG_OBJS_LIBRARY);
|
||||||
|
public static final ImageDescriptor DESC_OBJS_ORDER= createManaged(T_OBJ, IMG_OBJS_ORDER);
|
||||||
|
public static final ImageDescriptor DESC_OBJS_EXCLUSION_FILTER_ATTRIB = createManaged(T_OBJ, IMG_OBJS_EXCLUDSION_FILTER_ATTRIB);
|
||||||
|
|
||||||
// Breakpoint image descriptors
|
// Breakpoint image descriptors
|
||||||
public static final ImageDescriptor DESC_OBJS_BREAKPOINT = createManaged( T_OBJ, IMG_OBJS_BREAKPOINT );
|
public static final ImageDescriptor DESC_OBJS_BREAKPOINT = createManaged( T_OBJ, IMG_OBJS_BREAKPOINT );
|
||||||
|
@ -155,8 +162,6 @@ public class CPluginImages {
|
||||||
public static final ImageDescriptor DESC_WIZABAN_NEW_PROJ= create(T_WIZBAN, "newcprj_wiz.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_WIZABAN_NEW_PROJ= create(T_WIZBAN, "newcprj_wiz.gif"); //$NON-NLS-1$
|
||||||
public static final ImageDescriptor DESC_WIZBAN_NEWCLASS= create(T_WIZBAN, "newclass_wiz.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_WIZBAN_NEWCLASS= create(T_WIZBAN, "newclass_wiz.gif"); //$NON-NLS-1$
|
||||||
public static final ImageDescriptor DESC_WIZABAN_C_APP= create(T_WIZBAN, "c_app_wiz.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_WIZABAN_C_APP= create(T_WIZBAN, "c_app_wiz.gif"); //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_PROJECT = NAME_PREFIX + "prj_obj.gif"; //$NON-NLS-1$
|
|
||||||
public static final ImageDescriptor DESC_PROJECT= createManaged(T_WIZBAN, IMG_OBJS_PROJECT);
|
|
||||||
|
|
||||||
public static final ImageDescriptor DESC_TOOL_NEWCLASS= create(T_TOOL, "newclass_wiz.gif"); //$NON-NLS-1$
|
public static final ImageDescriptor DESC_TOOL_NEWCLASS= create(T_TOOL, "newclass_wiz.gif"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,24 @@ public class StatusInfo implements IStatus {
|
||||||
private String fStatusMessage;
|
private String fStatusMessage;
|
||||||
private int fSeverity;
|
private int fSeverity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a status set to OK (no message)
|
||||||
|
*/
|
||||||
|
public StatusInfo() {
|
||||||
|
this(OK, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a status .
|
||||||
|
* @param severity The status severity: ERROR, WARNING, INFO and OK.
|
||||||
|
* @param message The message of the status. Applies only for ERROR,
|
||||||
|
* WARNING and INFO.
|
||||||
|
*/
|
||||||
|
public StatusInfo(int severity, String message) {
|
||||||
|
fStatusMessage= message;
|
||||||
|
fSeverity= severity;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IStatus#getChildren()
|
* @see IStatus#getChildren()
|
||||||
*/
|
*/
|
||||||
|
@ -95,8 +113,4 @@ public class StatusInfo implements IStatus {
|
||||||
fStatusMessage= warningMessage;
|
fStatusMessage= warningMessage;
|
||||||
fSeverity= IStatus.WARNING;
|
fSeverity= IStatus.WARNING;
|
||||||
}
|
}
|
||||||
public StatusInfo() {
|
|
||||||
fStatusMessage= null;
|
|
||||||
fSeverity= OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Viewer filter for archive selection dialogs. Archives are files with file
|
||||||
|
* extension '.so', '.dll' and '.a'. The filter is not case sensitive.
|
||||||
|
*/
|
||||||
|
public class ArchiveFileFilter extends ViewerFilter {
|
||||||
|
|
||||||
|
private static final String[] fgArchiveExtensions = { ".so", ".a", ".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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,413 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.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.IIncludeEntry;
|
||||||
|
import org.eclipse.cdt.core.model.ILibraryEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IOutputEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
|
import org.eclipse.cdt.core.model.ISourceEntry;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
|
public class CPListElement {
|
||||||
|
|
||||||
|
public static final String SOURCEATTACHMENT = "sourcepath"; //$NON-NLS-1$
|
||||||
|
public static final String SOURCEATTACHMENTROOT = "rootpath"; //$NON-NLS-1$
|
||||||
|
public static final String EXCLUSION = "exclusion"; //$NON-NLS-1$
|
||||||
|
public static final String INCLUDE = "includepath"; //$NON-NLS-1$
|
||||||
|
public static final String DEFINE = "define"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private ICProject fProject;
|
||||||
|
|
||||||
|
private int fEntryKind;
|
||||||
|
private IPath fPath;
|
||||||
|
private IResource fResource;
|
||||||
|
private boolean fIsExported;
|
||||||
|
private boolean fIsMissing;
|
||||||
|
|
||||||
|
private CPListElement fParentContainer;
|
||||||
|
|
||||||
|
private IPathEntry fCachedEntry;
|
||||||
|
private ArrayList fChildren;
|
||||||
|
|
||||||
|
public CPListElement(ICProject project, int entryKind, IPath path, IResource res) {
|
||||||
|
fProject = project;
|
||||||
|
|
||||||
|
fEntryKind = entryKind;
|
||||||
|
fPath = path;
|
||||||
|
fChildren = new ArrayList();
|
||||||
|
fResource = res;
|
||||||
|
fIsExported = false;
|
||||||
|
|
||||||
|
fIsMissing = false;
|
||||||
|
fCachedEntry = null;
|
||||||
|
fParentContainer = null;
|
||||||
|
|
||||||
|
switch (entryKind) {
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
createAttributeElement(EXCLUSION, new Path[0]);
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
createAttributeElement(EXCLUSION, new Path[0]);
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
createAttributeElement(SOURCEATTACHMENT, null);
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
case IPathEntry.CDT_INCLUDE:
|
||||||
|
createAttributeElement(INCLUDE, null);
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_MACRO:
|
||||||
|
createAttributeElement(DEFINE, null);
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
try {
|
||||||
|
IPathEntryContainer container = CoreModel.getDefault().getPathEntryContainer(fPath, fProject);
|
||||||
|
if (container != null) {
|
||||||
|
IPathEntry[] entries = container.getPathEntries();
|
||||||
|
for (int i = 0; i < entries.length; i++) {
|
||||||
|
CPListElement curr = createFromExisting(entries[i], fProject);
|
||||||
|
curr.setParentContainer(this);
|
||||||
|
fChildren.add(curr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPathEntry getPathEntry() {
|
||||||
|
if (fCachedEntry == null) {
|
||||||
|
fCachedEntry = newPathEntry();
|
||||||
|
}
|
||||||
|
return fCachedEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IPathEntry newPathEntry() {
|
||||||
|
IPath[] exclusionPattern;
|
||||||
|
switch (fEntryKind) {
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
exclusionPattern = (IPath[]) getAttribute(EXCLUSION);
|
||||||
|
return CoreModel.newOutputEntry(fPath, exclusionPattern);
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
exclusionPattern = (IPath[]) getAttribute(EXCLUSION);
|
||||||
|
return CoreModel.newSourceEntry(fPath, exclusionPattern);
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
IPath attach = (IPath) getAttribute(SOURCEATTACHMENT);
|
||||||
|
return CoreModel.newLibraryEntry(fPath, attach, null, null, isExported());
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
return CoreModel.newProjectEntry(fPath, isExported());
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
return CoreModel.newContainerEntry(fPath, isExported());
|
||||||
|
case IPathEntry.CDT_INCLUDE:
|
||||||
|
exclusionPattern = (IPath[]) getAttribute(EXCLUSION);
|
||||||
|
return CoreModel.newIncludeEntry(fPath, (IPath) getAttribute(INCLUDE));
|
||||||
|
case IPathEntry.CDT_MACRO:
|
||||||
|
exclusionPattern = (IPath[]) getAttribute(EXCLUSION);
|
||||||
|
return CoreModel.newMacroEntry(fPath, (String) getAttribute(DEFINE), null);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static StringBuffer appendEncodePath(IPath path, StringBuffer buf) {
|
||||||
|
if (path != null) {
|
||||||
|
String str= path.toString();
|
||||||
|
buf.append('[').append(str.length()).append(']').append(str);
|
||||||
|
} else {
|
||||||
|
buf.append('[').append(']');
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public StringBuffer appendEncodedSettings(StringBuffer buf) {
|
||||||
|
buf.append(fEntryKind).append(';');
|
||||||
|
appendEncodePath(fPath, buf).append(';');
|
||||||
|
buf.append(Boolean.valueOf(fIsExported)).append(';');
|
||||||
|
switch (fEntryKind) {
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
case IPathEntry.CDT_INCLUDE:
|
||||||
|
case IPathEntry.CDT_MACRO:
|
||||||
|
IPath[] exclusion= (IPath[]) getAttribute(EXCLUSION);
|
||||||
|
buf.append('[').append(exclusion.length).append(']');
|
||||||
|
for (int i= 0; i < exclusion.length; i++) {
|
||||||
|
appendEncodePath(exclusion[i], buf).append(';');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
IPath sourceAttach= (IPath) getAttribute(SOURCEATTACHMENT);
|
||||||
|
appendEncodePath(sourceAttach, buf).append(';');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the path entry path.
|
||||||
|
*
|
||||||
|
* @see IPathEntry#getPath()
|
||||||
|
*/
|
||||||
|
public IPath getPath() {
|
||||||
|
return fPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the classpath entry kind.
|
||||||
|
*
|
||||||
|
* @see IPathEntry#getEntryKind()
|
||||||
|
*/
|
||||||
|
public int getEntryKind() {
|
||||||
|
return fEntryKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entries without resource are either non existing or a variable entry
|
||||||
|
* External jars do not have a resource
|
||||||
|
*/
|
||||||
|
public IResource getResource() {
|
||||||
|
return fResource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CPListElementAttribute setAttribute(String key, Object value) {
|
||||||
|
CPListElementAttribute attribute = findAttributeElement(key);
|
||||||
|
if (attribute == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
attribute.setValue(value);
|
||||||
|
attributeChanged(key);
|
||||||
|
return attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElementAttribute findAttributeElement(String key) {
|
||||||
|
for (int i = 0; i < fChildren.size(); i++) {
|
||||||
|
Object curr = fChildren.get(i);
|
||||||
|
if (curr instanceof CPListElementAttribute) {
|
||||||
|
CPListElementAttribute elem = (CPListElementAttribute) curr;
|
||||||
|
if (key.equals(elem.getKey())) {
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getAttribute(String key) {
|
||||||
|
CPListElementAttribute attrib = findAttributeElement(key);
|
||||||
|
if (attrib != null) {
|
||||||
|
return attrib.getValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createAttributeElement(String key, Object value) {
|
||||||
|
fChildren.add(new CPListElementAttribute(this, key, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getChildren() {
|
||||||
|
if (fEntryKind == IPathEntry.CDT_OUTPUT || fEntryKind == IPathEntry.CDT_SOURCE || fEntryKind == IPathEntry.CDT_INCLUDE || fEntryKind == IPathEntry.CDT_MACRO) {
|
||||||
|
|
||||||
|
return new Object[] { findAttributeElement(EXCLUSION)};
|
||||||
|
|
||||||
|
}
|
||||||
|
return fChildren.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setParentContainer(CPListElement element) {
|
||||||
|
fParentContainer = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CPListElement getParentContainer() {
|
||||||
|
return fParentContainer;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void attributeChanged(String key) {
|
||||||
|
fCachedEntry = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see Object#equals(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (other != null && other.getClass().equals(getClass())) {
|
||||||
|
CPListElement elem = (CPListElement) other;
|
||||||
|
return elem.fEntryKind == fEntryKind && elem.fPath.equals(fPath);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see Object#hashCode()
|
||||||
|
*/
|
||||||
|
public int hashCode() {
|
||||||
|
return fPath.hashCode() + fEntryKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
public String toString() {
|
||||||
|
return getPathEntry().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if a entry is missing.
|
||||||
|
*
|
||||||
|
* @return Returns a boolean
|
||||||
|
*/
|
||||||
|
public boolean isMissing() {
|
||||||
|
return fIsMissing;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the 'missing' state of the entry.
|
||||||
|
*/
|
||||||
|
public void setIsMissing(boolean isMissing) {
|
||||||
|
fIsMissing = isMissing;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if a entry is exported (only applies to libraries)
|
||||||
|
*
|
||||||
|
* @return Returns a boolean
|
||||||
|
*/
|
||||||
|
public boolean isExported() {
|
||||||
|
return fIsExported;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the export state of the entry.
|
||||||
|
*/
|
||||||
|
public void setExported(boolean isExported) {
|
||||||
|
if (isExported != fIsExported) {
|
||||||
|
fIsExported = isExported;
|
||||||
|
|
||||||
|
attributeChanged(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the project.
|
||||||
|
*
|
||||||
|
* @return Returns a ICProject
|
||||||
|
*/
|
||||||
|
public ICProject getCProject() {
|
||||||
|
return fProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CPListElement createFromExisting(IPathEntry curr, ICProject project) {
|
||||||
|
IPath path = curr.getPath();
|
||||||
|
IWorkspaceRoot root = project.getProject().getWorkspace().getRoot();
|
||||||
|
IPath sourceAttachment = null;
|
||||||
|
IPath[] exclusion = null;
|
||||||
|
// get the resource
|
||||||
|
IResource res = null;
|
||||||
|
boolean isMissing = false;
|
||||||
|
// URL javaDocLocation = null;
|
||||||
|
|
||||||
|
switch (curr.getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
res = null;
|
||||||
|
try {
|
||||||
|
isMissing = (CoreModel.getDefault().getPathEntryContainer(path, project) == null);
|
||||||
|
} catch (CModelException e) {
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
res = root.findMember(path);
|
||||||
|
if (res == null) {
|
||||||
|
if (!ArchiveFileFilter.isArchivePath(path)) {
|
||||||
|
if (root.getWorkspace().validatePath(path.toString(), IResource.FOLDER).isOK()
|
||||||
|
&& root.getProject(path.segment(0)).exists()) {
|
||||||
|
res = root.getFolder(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isMissing = !path.toFile().isFile(); // look for external
|
||||||
|
}
|
||||||
|
sourceAttachment = ((ILibraryEntry) curr).getSourceAttachmentPath();
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
path = path.removeTrailingSeparator();
|
||||||
|
res = root.findMember(path);
|
||||||
|
if (res == null) {
|
||||||
|
if (root.getWorkspace().validatePath(path.toString(), IResource.FOLDER).isOK()) {
|
||||||
|
res = root.getFolder(path);
|
||||||
|
}
|
||||||
|
isMissing = true;
|
||||||
|
}
|
||||||
|
exclusion = ((ISourceEntry) curr).getExclusionPatterns();
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
path = path.removeTrailingSeparator();
|
||||||
|
res = root.findMember(path);
|
||||||
|
if (res == null) {
|
||||||
|
if (root.getWorkspace().validatePath(path.toString(), IResource.FOLDER).isOK()) {
|
||||||
|
res = root.getFolder(path);
|
||||||
|
}
|
||||||
|
isMissing = true;
|
||||||
|
}
|
||||||
|
exclusion = ((IOutputEntry) curr).getExclusionPatterns();
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_INCLUDE:
|
||||||
|
path = path.removeTrailingSeparator();
|
||||||
|
res = root.findMember(path);
|
||||||
|
if (res == null) {
|
||||||
|
if (root.getWorkspace().validatePath(path.toString(), IResource.FOLDER).isOK()) {
|
||||||
|
res = root.getFolder(path);
|
||||||
|
}
|
||||||
|
isMissing = !path.toFile().isFile(); // look for external
|
||||||
|
}
|
||||||
|
exclusion = ((IIncludeEntry) curr).getExclusionPatterns();
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_MACRO:
|
||||||
|
path = path.removeTrailingSeparator();
|
||||||
|
res = root.findMember(path);
|
||||||
|
if (res == null) {
|
||||||
|
if (root.getWorkspace().validatePath(path.toString(), IResource.FOLDER).isOK()) {
|
||||||
|
res = root.getFolder(path);
|
||||||
|
}
|
||||||
|
isMissing = !path.toFile().isFile(); // look for external
|
||||||
|
}
|
||||||
|
exclusion = ((IMacroEntry) curr).getExclusionPatterns();
|
||||||
|
break;
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
res = root.findMember(path);
|
||||||
|
isMissing = (res == null);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CPListElement elem = new CPListElement(project, curr.getEntryKind(), path, res);
|
||||||
|
elem.setAttribute(SOURCEATTACHMENT, sourceAttachment);
|
||||||
|
elem.setAttribute(EXCLUSION, exclusion);
|
||||||
|
elem.setExported(curr.isExported());
|
||||||
|
|
||||||
|
if (project.exists()) {
|
||||||
|
elem.setIsMissing(isMissing);
|
||||||
|
}
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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;
|
||||||
|
|
||||||
|
public class CPListElementAttribute {
|
||||||
|
|
||||||
|
private CPListElement fParent;
|
||||||
|
private String fKey;
|
||||||
|
private Object fValue;
|
||||||
|
|
||||||
|
public CPListElementAttribute(CPListElement parent, String key, Object value) {
|
||||||
|
fKey = key;
|
||||||
|
fValue = value;
|
||||||
|
fParent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CPListElement getParent() {
|
||||||
|
return fParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key.
|
||||||
|
*
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getKey() {
|
||||||
|
return fKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value.
|
||||||
|
*
|
||||||
|
* @return Object
|
||||||
|
*/
|
||||||
|
public Object getValue() {
|
||||||
|
return fValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value.
|
||||||
|
*/
|
||||||
|
public void setValue(Object value) {
|
||||||
|
fValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.jface.viewers.ViewerSorter;
|
||||||
|
|
||||||
|
public class CPListElementSorter extends ViewerSorter {
|
||||||
|
|
||||||
|
private static final int SOURCE = 0;
|
||||||
|
private static final int PROJECT = 1;
|
||||||
|
private static final int LIBRARY = 2;
|
||||||
|
private static final int VARIABLE = 3;
|
||||||
|
private static final int CONTAINER = 4;
|
||||||
|
private static final int OTHER = 5;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see ViewerSorter#category(Object)
|
||||||
|
*/
|
||||||
|
public int category(Object obj) {
|
||||||
|
if (obj instanceof CPListElement) {
|
||||||
|
switch (((CPListElement) obj).getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
return LIBRARY;
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
return PROJECT;
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
return SOURCE;
|
||||||
|
case IPathEntry.CDT_VARIABLE:
|
||||||
|
return VARIABLE;
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
return CONTAINER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return OTHER;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,244 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry;
|
||||||
|
import org.eclipse.cdt.ui.CElementImageDescriptor;
|
||||||
|
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.IPath;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.graphics.Point;
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.ui.ide.IDE;
|
||||||
|
|
||||||
|
class CPListLabelProvider extends LabelProvider {
|
||||||
|
|
||||||
|
private String fNewLabel, fClassLabel, fCreateLabel;
|
||||||
|
private ImageDescriptor fIncludeIcon, fMacroIcon, fLibWSrcIcon, fLibIcon, fExtLibIcon, fExtLibWSrcIcon;
|
||||||
|
private ImageDescriptor fFolderImage, fOutputImage, fProjectImage, fContainerImage;
|
||||||
|
|
||||||
|
private ImageDescriptorRegistry fRegistry;
|
||||||
|
|
||||||
|
public CPListLabelProvider() {
|
||||||
|
fNewLabel = CPathEntryMessages.getString("CPListLabelProvider.new"); //$NON-NLS-1$
|
||||||
|
fClassLabel = CPathEntryMessages.getString("CPListLabelProvider.classcontainer"); //$NON-NLS-1$
|
||||||
|
fCreateLabel = CPathEntryMessages.getString("CPListLabelProvider.willbecreated"); //$NON-NLS-1$
|
||||||
|
fRegistry = CUIPlugin.getImageDescriptorRegistry();
|
||||||
|
|
||||||
|
fLibIcon = CPluginImages.DESC_OBJS_ARCHIVE;
|
||||||
|
fLibWSrcIcon = CPluginImages.DESC_OBJS_ARCHIVE_WSRC;
|
||||||
|
fIncludeIcon = CPluginImages.DESC_OBJS_INCLUDE;
|
||||||
|
fMacroIcon = CPluginImages.DESC_OBJS_MACRO;
|
||||||
|
fFolderImage = CPluginImages.DESC_OBJS_SOURCE_ROOT;
|
||||||
|
fOutputImage = CPluginImages.DESC_OBJS_CONTAINER;
|
||||||
|
fContainerImage = CPluginImages.DESC_OBJS_LIBRARY;
|
||||||
|
|
||||||
|
IWorkbench workbench = CUIPlugin.getDefault().getWorkbench();
|
||||||
|
|
||||||
|
fProjectImage = workbench.getSharedImages().getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText(Object element) {
|
||||||
|
if (element instanceof CPListElement) {
|
||||||
|
return getCPListElementText((CPListElement) element);
|
||||||
|
} else if (element instanceof CPListElementAttribute) {
|
||||||
|
return getCPListElementAttributeText((CPListElementAttribute) element);
|
||||||
|
}
|
||||||
|
return super.getText(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCPListElementAttributeText(CPListElementAttribute attrib) {
|
||||||
|
String notAvailable = CPathEntryMessages.getString("CPListLabelProvider.none"); //$NON-NLS-1$
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
String key = attrib.getKey();
|
||||||
|
if (key.equals(CPListElement.SOURCEATTACHMENT)) {
|
||||||
|
buf.append(CPathEntryMessages.getString("CPListLabelProvider.source_attachment.label")); //$NON-NLS-1$
|
||||||
|
IPath path = (IPath) attrib.getValue();
|
||||||
|
if (path != null && !path.isEmpty()) {
|
||||||
|
buf.append(getPathString(path, path.getDevice() != null));
|
||||||
|
} else {
|
||||||
|
buf.append(notAvailable);
|
||||||
|
}
|
||||||
|
} else if (key.equals(CPListElement.SOURCEATTACHMENTROOT)) {
|
||||||
|
buf.append(CPathEntryMessages.getString("CPListLabelProvider.source_attachment_root.label")); //$NON-NLS-1$
|
||||||
|
IPath path = (IPath) attrib.getValue();
|
||||||
|
if (path != null && !path.isEmpty()) {
|
||||||
|
buf.append(path.toString());
|
||||||
|
} else {
|
||||||
|
buf.append(notAvailable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (key.equals(CPListElement.EXCLUSION)) {
|
||||||
|
buf.append(CPathEntryMessages.getString("CPListLabelProvider.exclusion_filter.label")); //$NON-NLS-1$
|
||||||
|
IPath[] patterns = (IPath[]) attrib.getValue();
|
||||||
|
if (patterns != null && patterns.length > 0) {
|
||||||
|
for (int i = 0; i < patterns.length; i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
buf.append(CPathEntryMessages.getString("CPListLabelProvider.exclusion_filter_separator")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
buf.append(patterns[i].toString());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buf.append(notAvailable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCPListElementText(CPListElement cpentry) {
|
||||||
|
IPath path = cpentry.getPath();
|
||||||
|
switch (cpentry.getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
{
|
||||||
|
IResource resource = cpentry.getResource();
|
||||||
|
if (resource instanceof IContainer) {
|
||||||
|
StringBuffer buf = new StringBuffer(path.makeRelative().toString());
|
||||||
|
buf.append(' ');
|
||||||
|
buf.append(fClassLabel);
|
||||||
|
if (!resource.exists()) {
|
||||||
|
buf.append(' ');
|
||||||
|
if (cpentry.isMissing()) {
|
||||||
|
buf.append(fCreateLabel);
|
||||||
|
} else {
|
||||||
|
buf.append(fNewLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
} else if (ArchiveFileFilter.isArchivePath(path)) {
|
||||||
|
return getPathString(path, resource == null);
|
||||||
|
}
|
||||||
|
// should not come here
|
||||||
|
return path.makeRelative().toString();
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
return path.lastSegment();
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
try {
|
||||||
|
IPathEntryContainer container = CoreModel.getDefault().getPathEntryContainer(cpentry.getPath(),
|
||||||
|
cpentry.getCProject());
|
||||||
|
if (container != null) {
|
||||||
|
return container.getDescription();
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
}
|
||||||
|
return path.toString();
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
{
|
||||||
|
StringBuffer buf = new StringBuffer(path.makeRelative().toString());
|
||||||
|
IResource resource = cpentry.getResource();
|
||||||
|
if (resource != null && !resource.exists()) {
|
||||||
|
buf.append(' ');
|
||||||
|
if (cpentry.isMissing()) {
|
||||||
|
buf.append(fCreateLabel);
|
||||||
|
} else {
|
||||||
|
buf.append(fNewLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// pass
|
||||||
|
}
|
||||||
|
return CPathEntryMessages.getString("CPListLabelProvider.unknown_element.label"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPathString(IPath path, boolean isExternal) {
|
||||||
|
if (ArchiveFileFilter.isArchivePath(path)) {
|
||||||
|
IPath appendedPath = path.removeLastSegments(1);
|
||||||
|
String appended = isExternal ? appendedPath.toOSString() : appendedPath.makeRelative().toString();
|
||||||
|
return CPathEntryMessages.getFormattedString("CPListLabelProvider.twopart", new String[] { path.lastSegment(), appended}); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
return isExternal ? path.toOSString() : path.makeRelative().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ImageDescriptor getCPListElementBaseImage(CPListElement cpentry) {
|
||||||
|
switch (cpentry.getEntryKind()) {
|
||||||
|
case IPathEntry.CDT_OUTPUT:
|
||||||
|
if (cpentry.getPath().segmentCount() == 1) {
|
||||||
|
return fProjectImage;
|
||||||
|
} else {
|
||||||
|
return fOutputImage;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_SOURCE:
|
||||||
|
if (cpentry.getPath().segmentCount() == 1) {
|
||||||
|
return fProjectImage;
|
||||||
|
} else {
|
||||||
|
return fFolderImage;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_LIBRARY:
|
||||||
|
IResource res = cpentry.getResource();
|
||||||
|
IPath path = (IPath) cpentry.getAttribute(CPListElement.SOURCEATTACHMENT);
|
||||||
|
if (res == null) {
|
||||||
|
if (path == null || path.isEmpty()) {
|
||||||
|
return fExtLibIcon;
|
||||||
|
} else {
|
||||||
|
return fExtLibWSrcIcon;
|
||||||
|
}
|
||||||
|
} else if (res instanceof IFile) {
|
||||||
|
if (path == null || path.isEmpty()) {
|
||||||
|
return fLibIcon;
|
||||||
|
} else {
|
||||||
|
return fLibWSrcIcon;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return fFolderImage;
|
||||||
|
}
|
||||||
|
case IPathEntry.CDT_PROJECT:
|
||||||
|
return fProjectImage;
|
||||||
|
case IPathEntry.CDT_CONTAINER:
|
||||||
|
return fContainerImage;
|
||||||
|
case IPathEntry.CDT_INCLUDE:
|
||||||
|
return fIncludeIcon;
|
||||||
|
case IPathEntry.CDT_MACRO:
|
||||||
|
return fMacroIcon;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Point SMALL_SIZE = new Point(16, 16);
|
||||||
|
|
||||||
|
public Image getImage(Object element) {
|
||||||
|
if (element instanceof CPListElement) {
|
||||||
|
CPListElement cpentry = (CPListElement) element;
|
||||||
|
ImageDescriptor imageDescriptor = getCPListElementBaseImage(cpentry);
|
||||||
|
if (imageDescriptor != null) {
|
||||||
|
if (cpentry.isMissing()) {
|
||||||
|
imageDescriptor = new CElementImageDescriptor(imageDescriptor, CElementImageDescriptor.WARNING, SMALL_SIZE);
|
||||||
|
}
|
||||||
|
return fRegistry.get(imageDescriptor);
|
||||||
|
}
|
||||||
|
} else if (element instanceof CPListElementAttribute) {
|
||||||
|
String key = ((CPListElementAttribute) element).getKey();
|
||||||
|
if (key.equals(CPListElement.SOURCEATTACHMENT)) {
|
||||||
|
// return fRegistry.get(CPluginImages.DESC_OBJS_SOURCE_ATTACH_ATTRIB);
|
||||||
|
} else if (key.equals(CPListElement.EXCLUSION)) {
|
||||||
|
return CPluginImages.get(CPluginImages.IMG_OBJS_EXCLUDSION_FILTER_ATTRIB);
|
||||||
|
} else if (key.equals(CPListElement.INCLUDE)) {
|
||||||
|
// return fRegistry.get(CPluginImages.DESC_OBJS_INCLUDE_ATTRIB);
|
||||||
|
} else if (key.equals(CPListElement.DEFINE)) {
|
||||||
|
// return fRegistry.get(CPluginImages.DESC_OBJS_MACRO_ATTRIB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModelUtil;
|
||||||
|
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
|
||||||
|
public abstract class CPathBasePage extends AbstractCOptionPage {
|
||||||
|
|
||||||
|
public abstract List getSelection();
|
||||||
|
|
||||||
|
public abstract void setSelection(List selection);
|
||||||
|
|
||||||
|
public abstract boolean isEntryKind(int kind);
|
||||||
|
|
||||||
|
public CPathBasePage(String title) {
|
||||||
|
super(title);
|
||||||
|
}
|
||||||
|
public CPathBasePage(String title, ImageDescriptor image) {
|
||||||
|
super(title, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void filterAndSetSelection(List list) {
|
||||||
|
ArrayList res = new ArrayList(list.size());
|
||||||
|
for (int i = list.size() - 1; i >= 0; i--) {
|
||||||
|
Object curr = list.get(i);
|
||||||
|
if (curr instanceof CPListElement) {
|
||||||
|
CPListElement elem = (CPListElement) curr;
|
||||||
|
if (elem.getParentContainer() == null && isEntryKind(elem.getEntryKind())) {
|
||||||
|
res.add(curr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setSelection(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void fixNestingConflicts(List newEntries, List existing, Set modifiedSourceEntries) {
|
||||||
|
for (int i = 0; i < newEntries.size(); i++) {
|
||||||
|
CPListElement curr = (CPListElement) newEntries.get(i);
|
||||||
|
addExclusionPatterns(curr, existing, modifiedSourceEntries);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addExclusionPatterns(CPListElement newEntry, List existing, Set modifiedEntries) {
|
||||||
|
IPath entryPath = newEntry.getPath();
|
||||||
|
for (int i = 0; i < existing.size(); i++) {
|
||||||
|
CPListElement curr = (CPListElement) existing.get(i);
|
||||||
|
if (curr.getEntryKind() == IPathEntry.CDT_SOURCE) {
|
||||||
|
IPath currPath = curr.getPath();
|
||||||
|
if (currPath.isPrefixOf(entryPath) && !currPath.equals(entryPath)) {
|
||||||
|
IPath[] exclusionFilters = (IPath[]) curr.getAttribute(CPListElement.EXCLUSION);
|
||||||
|
if (!CoreModelUtil.isExcludedPath(entryPath, exclusionFilters)) {
|
||||||
|
IPath pathToExclude = entryPath.removeFirstSegments(currPath.segmentCount()).addTrailingSeparator();
|
||||||
|
IPath[] newExclusionFilters = new IPath[exclusionFilters.length + 1];
|
||||||
|
System.arraycopy(exclusionFilters, 0, newExclusionFilters, 0, exclusionFilters.length);
|
||||||
|
newExclusionFilters[exclusionFilters.length] = pathToExclude;
|
||||||
|
curr.setAttribute(CPListElement.EXCLUSION, newExclusionFilters);
|
||||||
|
modifiedEntries.add(curr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2001 Rational Software Corp. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v0.5
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v05.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Rational Software - initial implementation
|
||||||
|
******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
|
||||||
|
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
|
||||||
|
public class CPathEntryMessages {
|
||||||
|
|
||||||
|
private static final String RESOURCE_BUNDLE= CPathEntryMessages.class.getName();
|
||||||
|
private static ResourceBundle fgResourceBundle;
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
fgResourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE);
|
||||||
|
} catch (MissingResourceException x) {
|
||||||
|
fgResourceBundle = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPathEntryMessages() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getString(String key) {
|
||||||
|
try {
|
||||||
|
return fgResourceBundle.getString(key);
|
||||||
|
} catch (MissingResourceException e) {
|
||||||
|
return '!' + key + '!';
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
return "#" + key + "#"; //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a string from the resource bundle and formats it with the argument
|
||||||
|
*
|
||||||
|
* @param key the string used to get the bundle value, must not be null
|
||||||
|
*/
|
||||||
|
public static String getFormattedString(String key, Object arg) {
|
||||||
|
return MessageFormat.format(getString(key), new Object[] { arg });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a string from the resource bundle and formats it with arguments
|
||||||
|
*/
|
||||||
|
public static String getFormattedString(String key, Object[] args) {
|
||||||
|
return MessageFormat.format(getString(key), args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,198 @@
|
||||||
|
###############################################################################
|
||||||
|
# Copyright (c) 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
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
CPathsPropertyPage.no_C_project.message=Not a C/C++ project.
|
||||||
|
CPathsPropertyPage.closed_project.message=Path information is not available for a closed project.
|
||||||
|
CPathsPropertyPage.error.title=Error Setting Propject Paths
|
||||||
|
CPathsPropertyPage.error.message=An error occurred while setting the project path
|
||||||
|
CPathsPropertyPage.unsavedchanges.title=Setting C/C++ Project Path
|
||||||
|
CPathsPropertyPage.unsavedchanges.message=The C/C++ Project path property page contains unsaved modifications. Do you want to save changes so that other build path related property pages can be updated?
|
||||||
|
CPathsPropertyPage.unsavedchanges.button.save=Apply
|
||||||
|
CPathsPropertyPage.unsavedchanges.button.discard=Discard
|
||||||
|
CPathsPropertyPage.unsavedchanges.button.ignore=Apply Later
|
||||||
|
|
||||||
|
|
||||||
|
BuildPathsBlock.tab.libraries=&Libraries
|
||||||
|
|
||||||
|
# ------- BuildPathsBlock -------
|
||||||
|
|
||||||
|
CPathsBlock.path.up.button=&Up
|
||||||
|
CPathsBlock.path.down.button=&Down
|
||||||
|
CPathsBlock.path.checkall.button=Select &All
|
||||||
|
CPathsBlock.path.uncheckall.button=D&eselect All
|
||||||
|
|
||||||
|
CPathsBlock.path.label=Path order and exported entries:\n(Exported entries are contributed to dependent projects)
|
||||||
|
CPathsBlock.warning.EntryMissing=Build path entry is missing: {0}
|
||||||
|
CPathsBlock.warning.EntriesMissing={0} build path entries are missing.
|
||||||
|
|
||||||
|
CPathsBlock.operationdesc_project=Creating project...
|
||||||
|
CPathsBlock.operationdesc_c=Setting build paths...
|
||||||
|
|
||||||
|
# ------- SourcePathEntryPage-------
|
||||||
|
SourcePathEntryPage.title=&Source
|
||||||
|
SourcePathEntryPage.description=Source Path for project
|
||||||
|
SourcePathEntryPage.folders.label=Source folders on build pat&h:
|
||||||
|
SourcePathEntryPage.folders.remove.button=&Remove
|
||||||
|
SourcePathEntryPage.folders.add.button=&Add Folder...
|
||||||
|
SourcePathEntryPath.folders.edit.button=&Edit...
|
||||||
|
|
||||||
|
SourcePathEntryPage.ExistingSourceFolderDialog.new.title=Source Folder Selection
|
||||||
|
SourcePathEntryPage.ExistingSourceFolderDialog.new.description=&Choose source folders to be added to the build path:
|
||||||
|
|
||||||
|
SourcePathEntryPage.ExistingSourceFolderDialog.edit.title=Source Folder Selection
|
||||||
|
SourcePathEntryPage.ExistingSourceFolderDialog.edit.description=&Select the source folder:
|
||||||
|
|
||||||
|
SourcePathEntryPage.NewSourceFolderDialog.new.title=New Source Folder
|
||||||
|
SourcePathEntryPage.NewSourceFolderDialog.edit.title=Edit Source Folder
|
||||||
|
|
||||||
|
SourcePathEntryPage.NewSourceFolderDialog.description=&Enter a path relative to ''{0}'':
|
||||||
|
|
||||||
|
SourcePathEntryPage.exclusion_added.title=Source Folder Added
|
||||||
|
SourcePathEntryPage.exclusion_added.message=Exclusion filters have been added to nesting folders.
|
||||||
|
|
||||||
|
# ------- OutputPathEntryPage-------
|
||||||
|
|
||||||
|
OutputPathEntryPage.title=&Output
|
||||||
|
OutputPathEntryPage.description=Build Output locations
|
||||||
|
OutputPathEntryPage.folders.label=Output folders on build pat&h:
|
||||||
|
OutputPathEntryPage.folders.remove.button=&Remove
|
||||||
|
OutputPathEntryPage.folders.add.button=&Add Folder...
|
||||||
|
OutputPathEntryPage.folders.edit.button=&Edit...
|
||||||
|
|
||||||
|
OutputPathEntryPage.ExistingOutputFolderDialog.new.title=Output Folder Selection
|
||||||
|
OutputPathEntryPage.ExistingOutputFolderDialog.new.description=&Choose Output folders to be added to the build path:
|
||||||
|
|
||||||
|
OutputPathEntryPage.ExistingOutputFolderDialog.edit.title=Output Folder Selection
|
||||||
|
OutputPathEntryPage.ExistingOutputFolderDialog.edit.description=&Select the Output folder:
|
||||||
|
|
||||||
|
OutputPathEntryPage.NewOutputFolderDialog.new.title=New Output Folder
|
||||||
|
OutputPathEntryPage.NewOutputFolderDialog.edit.title=Edit Output Folder
|
||||||
|
|
||||||
|
OutputPathEntryPage.NewOutputFolderDialog.description=&Enter a path relative to ''{0}'':
|
||||||
|
|
||||||
|
OutputPathEntryPage.exclusion_added.title=Output Folder Added
|
||||||
|
OutputPathEntryPage.exclusion_added.message=Exclusion filters have been added to nesting folders.
|
||||||
|
|
||||||
|
# ------- ProjectsWorkbookPage-------
|
||||||
|
ProjectsEntryPage.title=&Projects
|
||||||
|
ProjectsEntryPage.description=
|
||||||
|
ProjectsEntryPage.projects.label=&Required projects on the build path:
|
||||||
|
ProjectsEntryPage.projects.checkall.button=Select &All
|
||||||
|
ProjectsEntryWorkbookPage.projects.uncheckall.button=&Deselect All
|
||||||
|
|
||||||
|
# ------- LibrariesWorkbookPage-------
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.libraries.label=JARs &and class folders on the build path:
|
||||||
|
LibrariesWorkbookPage.libraries.remove.button=&Remove
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.libraries.addjar.button=Add &JARs...
|
||||||
|
LibrariesWorkbookPage.libraries.addextjar.button=Add E&xternal JARs...
|
||||||
|
LibrariesWorkbookPage.libraries.addvariable.button=Add &Variable...
|
||||||
|
LibrariesWorkbookPage.libraries.addlibrary.button=Add Li&brary...
|
||||||
|
LibrariesWorkbookPage.libraries.addclassfolder.button=Add Class &Folder...
|
||||||
|
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.libraries.edit.button=&Edit...
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.ExistingClassFolderDialog.new.title=Class Folder Selection
|
||||||
|
LibrariesWorkbookPage.ExistingClassFolderDialog.new.description=&Choose class folders to be added to the build path:
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.ExistingClassFolderDialog.edit.title=Edit Class Folder
|
||||||
|
LibrariesWorkbookPage.ExistingClassFolderDialog.edit.description=&Select the class folder:
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.NewClassFolderDialog.new.title=New Class Folder
|
||||||
|
LibrariesWorkbookPage.NewClassFolderDialog.edit.title=Edit Class Folder
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.NewClassFolderDialog.description=&Enter a path relative to ''{0}'':
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.JARArchiveDialog.new.title=JAR Selection
|
||||||
|
LibrariesWorkbookPage.JARArchiveDialog.new.description=&Choose jar archives to be added to the build path:
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.JARArchiveDialog.edit.title=Edit JAR
|
||||||
|
LibrariesWorkbookPage.JARArchiveDialog.edit.description=&Select the jar archive:
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.ContainerDialog.new.title=Add Library
|
||||||
|
LibrariesWorkbookPage.ContainerDialog.edit.title=Edit Library
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.VariableSelectionDialog.new.title=New Variable Classpath Entry
|
||||||
|
LibrariesWorkbookPage.VariableSelectionDialog.edit.title=Edit Variable Entry
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.ExtJARArchiveDialog.new.title=JAR Selection
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.ExtJARArchiveDialog.edit.title=Edit JAR
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.SourceAttachmentDialog.title=Source For ''{0}''
|
||||||
|
LibrariesWorkbookPage.JavadocPropertyDialog.title=Javadoc For ''{0}''
|
||||||
|
|
||||||
|
LibrariesWorkbookPage.AdvancedDialog.title=Add Classpath Entry
|
||||||
|
LibrariesWorkbookPage.AdvancedDialog.description=Select the entry to add to the classpath:
|
||||||
|
LibrariesWorkbookPage.AdvancedDialog.createfolder=Create &New Class Folder
|
||||||
|
LibrariesWorkbookPage.AdvancedDialog.addfolder=Add &Existing Class Folder
|
||||||
|
LibrariesWorkbookPage.AdvancedDialog.addcontainer=Add &Container:
|
||||||
|
|
||||||
|
# ------- ExclusionPatternDialog -------
|
||||||
|
|
||||||
|
ExclusionPatternDialog.title=Source Folder Exclusion Patterns
|
||||||
|
|
||||||
|
ExclusionPatternDialog.pattern.label=E&xclusion patterns for ''{0}'':
|
||||||
|
ExclusionPatternDialog.pattern.add=A&dd...
|
||||||
|
ExclusionPatternDialog.pattern.add.multiple=Add &Multiple...
|
||||||
|
ExclusionPatternDialog.pattern.remove=&Remove
|
||||||
|
ExclusionPatternDialog.pattern.edit=&Edit...
|
||||||
|
|
||||||
|
ExclusionPatternDialog.ChooseExclusionPattern.title=Exclusion Pattern Selection
|
||||||
|
ExclusionPatternDialog.ChooseExclusionPattern.description=&Choose folders or files to exclude:
|
||||||
|
|
||||||
|
# ------- ExclusionPatternEntryDialog -------
|
||||||
|
|
||||||
|
ExclusionPatternEntryDialog.add.title=Add Exclusion Pattern
|
||||||
|
ExclusionPatternEntryDialog.edit.title=Edit Exclusion Pattern
|
||||||
|
ExclusionPatternEntryDialog.description=Enter a pattern for excluding files from the source folder. Allowed wildcards are '*', '?' and '**'. Examples: 'java/util/A*.java', 'java/util/', '**/Test*'.
|
||||||
|
|
||||||
|
ExclusionPatternEntryDialog.pattern.label=E&xclusion pattern (Path relative to ''{0}''):
|
||||||
|
ExclusionPatternEntryDialog.pattern.button=Bro&wse...
|
||||||
|
|
||||||
|
ExclusionPatternEntryDialog.error.empty=Enter a pattern.
|
||||||
|
ExclusionPatternEntryDialog.error.notrelative=Pattern must be a relative path.
|
||||||
|
ExclusionPatternEntryDialog.error.exists=Pattern already exists.
|
||||||
|
|
||||||
|
ExclusionPatternEntryDialog.ChooseExclusionPattern.title=Exclusion Pattern Selection
|
||||||
|
ExclusionPatternEntryDialog.ChooseExclusionPattern.description=&Choose a folder or file to exclude:
|
||||||
|
|
||||||
|
OrderExportsPage.title=&Order and Export
|
||||||
|
OrderExportsPage.description=
|
||||||
|
# ------- ClasspathContainerDefaultPage-------
|
||||||
|
|
||||||
|
ClasspathContainerDefaultPage.title=Classpath Container
|
||||||
|
ClasspathContainerDefaultPage.description=Select classpath container path. First segment is the container type.
|
||||||
|
|
||||||
|
ClasspathContainerDefaultPage.path.label=&Classpath container path:
|
||||||
|
|
||||||
|
ClasspathContainerDefaultPage.path.error.enterpath=Enter path.
|
||||||
|
ClasspathContainerDefaultPage.path.error.invalidpath=Invalid path.
|
||||||
|
ClasspathContainerDefaultPage.path.error.needssegment=Path needs at least one segment.
|
||||||
|
ClasspathContainerDefaultPage.path.error.alreadyexists=Entry already exists.
|
||||||
|
|
||||||
|
# ------- ClasspathContainerSelectionPage-------
|
||||||
|
|
||||||
|
ClasspathContainerSelectionPage.title=Add Library
|
||||||
|
ClasspathContainerSelectionPage.description=Select the library type to add.
|
||||||
|
|
||||||
|
# ------- CPListLabelProvider -------
|
||||||
|
|
||||||
|
CPListLabelProvider.new=(new)
|
||||||
|
CPListLabelProvider.classcontainer=(class folder)
|
||||||
|
CPListLabelProvider.twopart={0} - {1}
|
||||||
|
CPListLabelProvider.willbecreated=(will be created)
|
||||||
|
CPListLabelProvider.none=(None)
|
||||||
|
CPListLabelProvider.source_attachment.label=Source attachment:
|
||||||
|
CPListLabelProvider.source_attachment_root.label=Source attachment root:
|
||||||
|
CPListLabelProvider.exclusion_filter.label=Exclusion filter:
|
||||||
|
CPListLabelProvider.exclusion_filter_separator=;
|
||||||
|
CPListLabelProvider.unknown_element.label=unknown element
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.PixelConverter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
|
||||||
|
public class CPathOrderExportPage extends CPathBasePage {
|
||||||
|
|
||||||
|
private ListDialogField fCPathList;
|
||||||
|
|
||||||
|
public CPathOrderExportPage(ListDialogField cPathList) {
|
||||||
|
super(CPathEntryMessages.getString("OrderExportsPage.title")); //$NON-NLS-1$
|
||||||
|
setDescription(CPathEntryMessages.getString("OrderExportsPage.description")); //$NON-NLS-1$
|
||||||
|
fCPathList = cPathList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.AbstractCOptionPage#createControl(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
PixelConverter converter = new PixelConverter(parent);
|
||||||
|
|
||||||
|
Composite composite = new Composite(parent, SWT.NONE);
|
||||||
|
setControl(composite);
|
||||||
|
|
||||||
|
LayoutUtil.doDefaultLayout(composite, new DialogField[]{fCPathList}, true);
|
||||||
|
LayoutUtil.setHorizontalGrabbing(fCPathList.getListControl(null));
|
||||||
|
|
||||||
|
int buttonBarWidth = converter.convertWidthInCharsToPixels(24);
|
||||||
|
fCPathList.setButtonsMinWidth(buttonBarWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Image getImage() {
|
||||||
|
return CPluginImages.get(CPluginImages.IMG_OBJS_ORDER);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#getSelection
|
||||||
|
*/
|
||||||
|
public List getSelection() {
|
||||||
|
return fCPathList.getSelectedElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#setSelection
|
||||||
|
*/
|
||||||
|
public void setSelection(List selElements) {
|
||||||
|
fCPathList.selectElements(new StructuredSelection(selElements));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int)
|
||||||
|
*/
|
||||||
|
public boolean isEntryKind(int kind) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.AbstractCOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.AbstractCOptionPage#performDefaults()
|
||||||
|
*/
|
||||||
|
public void performDefaults() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,561 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.PixelConverter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.TypedViewerFilter;
|
||||||
|
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.ITreeListAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IFolder;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
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;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.ui.dialogs.NewFolderDialog;
|
||||||
|
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
|
||||||
|
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
||||||
|
|
||||||
|
public class CPathOutputEntryPage extends CPathBasePage {
|
||||||
|
|
||||||
|
private ListDialogField fCPathList;
|
||||||
|
private ICProject fCurrCProject;
|
||||||
|
private IPath fProjPath;
|
||||||
|
|
||||||
|
private IWorkspaceRoot fWorkspaceRoot;
|
||||||
|
|
||||||
|
private TreeListDialogField fOutputList;
|
||||||
|
|
||||||
|
private final int IDX_ADD = 0;
|
||||||
|
private final int IDX_EDIT = 2;
|
||||||
|
private final int IDX_REMOVE = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param title
|
||||||
|
*/
|
||||||
|
public CPathOutputEntryPage(ListDialogField cPathList) {
|
||||||
|
super(CPathEntryMessages.getString("OutputPathEntryPage.title")); //$NON-NLS-1$
|
||||||
|
setDescription(CPathEntryMessages.getString("OutputPathEntryPage.description")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fWorkspaceRoot = CUIPlugin.getWorkspace().getRoot();
|
||||||
|
fCPathList = cPathList;
|
||||||
|
|
||||||
|
OutputContainerAdapter adapter = new OutputContainerAdapter();
|
||||||
|
|
||||||
|
String[] buttonLabels;
|
||||||
|
|
||||||
|
buttonLabels = new String[] {
|
||||||
|
/* 0 = IDX_ADDEXIST */CPathEntryMessages.getString("OutputPathEntryPage.folders.add.button"), //$NON-NLS-1$
|
||||||
|
/* 1 */ null, /* 2 = IDX_EDIT */CPathEntryMessages.getString("OutputPathEntryPage.folders.edit.button"), //$NON-NLS-1$
|
||||||
|
/* 3 = IDX_REMOVE */CPathEntryMessages.getString("OutputPathEntryPage.folders.remove.button") //$NON-NLS-1$
|
||||||
|
};
|
||||||
|
|
||||||
|
fOutputList = new TreeListDialogField(adapter, buttonLabels, new CPListLabelProvider());
|
||||||
|
fOutputList.setDialogFieldListener(adapter);
|
||||||
|
fOutputList.setLabelText(CPathEntryMessages.getString("OutputPathEntryPage.folders.label")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fOutputList.setViewerSorter(new CPListElementSorter());
|
||||||
|
fOutputList.enableButton(IDX_EDIT, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Image getImage() {
|
||||||
|
return CPluginImages.get(CPluginImages.IMG_OBJS_CONTAINER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(ICProject cproject) {
|
||||||
|
fCurrCProject = cproject;
|
||||||
|
fProjPath = fCurrCProject.getProject().getFullPath();
|
||||||
|
updateFoldersList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateFoldersList() {
|
||||||
|
ArrayList folders = new ArrayList();
|
||||||
|
|
||||||
|
List cpelements = fCPathList.getElements();
|
||||||
|
for (int i = 0; i < cpelements.size(); i++) {
|
||||||
|
CPListElement cpe = (CPListElement) cpelements.get(i);
|
||||||
|
if (cpe.getEntryKind() == IPathEntry.CDT_OUTPUT) {
|
||||||
|
folders.add(cpe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fOutputList.setElements(folders);
|
||||||
|
|
||||||
|
for (int i = 0; i < folders.size(); i++) {
|
||||||
|
CPListElement cpe = (CPListElement) folders.get(i);
|
||||||
|
IPath[] patterns = (IPath[]) cpe.getAttribute(CPListElement.EXCLUSION);
|
||||||
|
if (patterns.length > 0) {
|
||||||
|
fOutputList.expandElement(cpe, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
PixelConverter converter = new PixelConverter(parent);
|
||||||
|
Composite composite = new Composite(parent, SWT.NONE);
|
||||||
|
|
||||||
|
LayoutUtil.doDefaultLayout(composite, new DialogField[] { fOutputList}, true);
|
||||||
|
LayoutUtil.setHorizontalGrabbing(fOutputList.getTreeControl(null));
|
||||||
|
|
||||||
|
int buttonBarWidth = converter.convertWidthInCharsToPixels(24);
|
||||||
|
fOutputList.setButtonsMinWidth(buttonBarWidth);
|
||||||
|
|
||||||
|
// expand
|
||||||
|
List elements = fOutputList.getElements();
|
||||||
|
for (int i = 0; i < elements.size(); i++) {
|
||||||
|
CPListElement elem = (CPListElement) elements.get(i);
|
||||||
|
IPath[] patterns = (IPath[]) elem.getAttribute(CPListElement.EXCLUSION);
|
||||||
|
if (patterns.length > 0) {
|
||||||
|
fOutputList.expandElement(elem, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setControl(composite);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class OutputContainerAdapter implements ITreeListAdapter, IDialogFieldListener {
|
||||||
|
|
||||||
|
private final Object[] EMPTY_ARR = new Object[0];
|
||||||
|
|
||||||
|
// -------- IListAdapter --------
|
||||||
|
public void customButtonPressed(TreeListDialogField field, int index) {
|
||||||
|
outputPageCustomButtonPressed(field, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectionChanged(TreeListDialogField field) {
|
||||||
|
outputPageSelectionChanged(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doubleClicked(TreeListDialogField field) {
|
||||||
|
outputPageDoubleClicked(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void keyPressed(TreeListDialogField field, KeyEvent event) {
|
||||||
|
outputPageKeyPressed(field, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getChildren(TreeListDialogField field, Object element) {
|
||||||
|
if (element instanceof CPListElement) {
|
||||||
|
return ((CPListElement) element).getChildren();
|
||||||
|
}
|
||||||
|
return EMPTY_ARR;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getParent(TreeListDialogField field, Object element) {
|
||||||
|
if (element instanceof CPListElementAttribute) {
|
||||||
|
return ((CPListElementAttribute) element).getParent();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChildren(TreeListDialogField field, Object element) {
|
||||||
|
return (element instanceof CPListElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- IDialogFieldListener --------
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
outputPageDialogFieldChanged(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void outputPageKeyPressed(TreeListDialogField field, KeyEvent event) {
|
||||||
|
if (field == fOutputList) {
|
||||||
|
if (event.character == SWT.DEL && event.stateMask == 0) {
|
||||||
|
List selection = field.getSelectedElements();
|
||||||
|
if (canRemove(selection)) {
|
||||||
|
removeEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void outputPageDoubleClicked(TreeListDialogField field) {
|
||||||
|
if (field == fOutputList) {
|
||||||
|
List selection = field.getSelectedElements();
|
||||||
|
if (canEdit(selection)) {
|
||||||
|
editEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasFolders(IContainer container) {
|
||||||
|
try {
|
||||||
|
IResource[] members = container.members();
|
||||||
|
for (int i = 0; i < members.length; i++) {
|
||||||
|
if (members[i] instanceof IContainer) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void outputPageCustomButtonPressed(DialogField field, int index) {
|
||||||
|
if (field == fOutputList) {
|
||||||
|
if (index == IDX_ADD) {
|
||||||
|
List elementsToAdd = new ArrayList(10);
|
||||||
|
IProject project = fCurrCProject.getProject();
|
||||||
|
if (project.exists()) {
|
||||||
|
if (hasFolders(project)) {
|
||||||
|
CPListElement[] srcentries = openOutputContainerDialog(null);
|
||||||
|
if (srcentries != null) {
|
||||||
|
for (int i = 0; i < srcentries.length; i++) {
|
||||||
|
elementsToAdd.add(srcentries[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CPListElement entry = openNewOutputContainerDialog(null, true);
|
||||||
|
if (entry != null) {
|
||||||
|
elementsToAdd.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CPListElement entry = openNewOutputContainerDialog(null, false);
|
||||||
|
if (entry != null) {
|
||||||
|
elementsToAdd.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!elementsToAdd.isEmpty()) {
|
||||||
|
HashSet modifiedElements = new HashSet();
|
||||||
|
askForAddingExclusionPatternsDialog(elementsToAdd, modifiedElements);
|
||||||
|
|
||||||
|
fOutputList.addElements(elementsToAdd);
|
||||||
|
fOutputList.postSetSelection(new StructuredSelection(elementsToAdd));
|
||||||
|
|
||||||
|
if (!modifiedElements.isEmpty()) {
|
||||||
|
for (Iterator iter = modifiedElements.iterator(); iter.hasNext();) {
|
||||||
|
Object elem = iter.next();
|
||||||
|
fOutputList.refresh(elem);
|
||||||
|
fOutputList.expandElement(elem, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else if (index == IDX_EDIT) {
|
||||||
|
editEntry();
|
||||||
|
} else if (index == IDX_REMOVE) {
|
||||||
|
removeEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editEntry() {
|
||||||
|
List selElements = fOutputList.getSelectedElements();
|
||||||
|
if (selElements.size() != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Object elem = selElements.get(0);
|
||||||
|
if (fOutputList.getIndexOfElement(elem) != -1) {
|
||||||
|
editElementEntry((CPListElement) elem);
|
||||||
|
} else if (elem instanceof CPListElementAttribute) {
|
||||||
|
editAttributeEntry((CPListElementAttribute) elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editElementEntry(CPListElement elem) {
|
||||||
|
CPListElement res = null;
|
||||||
|
|
||||||
|
res = openNewOutputContainerDialog(elem, true);
|
||||||
|
|
||||||
|
if (res != null) {
|
||||||
|
fOutputList.replaceElement(elem, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editAttributeEntry(CPListElementAttribute elem) {
|
||||||
|
String key = elem.getKey();
|
||||||
|
if (key.equals(CPListElement.EXCLUSION)) {
|
||||||
|
CPListElement selElement = elem.getParent();
|
||||||
|
ExclusionPatternDialog dialog = new ExclusionPatternDialog(getShell(), selElement);
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
selElement.setAttribute(CPListElement.EXCLUSION, dialog.getExclusionPattern());
|
||||||
|
fOutputList.refresh();
|
||||||
|
fCPathList.dialogFieldChanged(); // validate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void outputPageSelectionChanged(DialogField field) {
|
||||||
|
List selected = fOutputList.getSelectedElements();
|
||||||
|
fOutputList.enableButton(IDX_EDIT, canEdit(selected));
|
||||||
|
fOutputList.enableButton(IDX_REMOVE, canRemove(selected));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeEntry() {
|
||||||
|
List selElements = fOutputList.getSelectedElements();
|
||||||
|
for (int i = selElements.size() - 1; i >= 0; i--) {
|
||||||
|
Object elem = selElements.get(i);
|
||||||
|
if (elem instanceof CPListElementAttribute) {
|
||||||
|
CPListElementAttribute attrib = (CPListElementAttribute) elem;
|
||||||
|
String key = attrib.getKey();
|
||||||
|
Object value = key.equals(CPListElement.EXCLUSION) ? new Path[0] : null;
|
||||||
|
attrib.getParent().setAttribute(key, value);
|
||||||
|
selElements.remove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selElements.isEmpty()) {
|
||||||
|
fOutputList.refresh();
|
||||||
|
fCPathList.dialogFieldChanged(); // validate
|
||||||
|
} else {
|
||||||
|
fOutputList.removeElements(selElements);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canRemove(List selElements) {
|
||||||
|
if (selElements.size() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < selElements.size(); i++) {
|
||||||
|
Object elem = selElements.get(i);
|
||||||
|
if (elem instanceof CPListElementAttribute) {
|
||||||
|
CPListElementAttribute attrib = (CPListElementAttribute) elem;
|
||||||
|
if (attrib.getKey().equals(CPListElement.EXCLUSION)) {
|
||||||
|
if (((IPath[]) attrib.getValue()).length == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (attrib.getValue() == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (elem instanceof CPListElement) {
|
||||||
|
CPListElement curr = (CPListElement) elem;
|
||||||
|
if (curr.getParentContainer() != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canEdit(List selElements) {
|
||||||
|
if (selElements.size() != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Object elem = selElements.get(0);
|
||||||
|
if (elem instanceof CPListElement) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (elem instanceof CPListElementAttribute) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void outputPageDialogFieldChanged(DialogField field) {
|
||||||
|
if (fCurrCProject == null) {
|
||||||
|
// not initialized
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (field == fOutputList) {
|
||||||
|
updateCPathList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCPathList() {
|
||||||
|
List srcelements = fOutputList.getElements();
|
||||||
|
|
||||||
|
List cpelements = fCPathList.getElements();
|
||||||
|
int nEntries = cpelements.size();
|
||||||
|
// backwards, as entries will be deleted
|
||||||
|
int lastRemovePos = nEntries;
|
||||||
|
int afterLastSourcePos = 0;
|
||||||
|
for (int i = nEntries - 1; i >= 0; i--) {
|
||||||
|
CPListElement cpe = (CPListElement) cpelements.get(i);
|
||||||
|
int kind = cpe.getEntryKind();
|
||||||
|
if (isEntryKind(kind)) {
|
||||||
|
if (!srcelements.remove(cpe)) {
|
||||||
|
cpelements.remove(i);
|
||||||
|
lastRemovePos = i;
|
||||||
|
} else if (lastRemovePos == nEntries) {
|
||||||
|
afterLastSourcePos = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!srcelements.isEmpty()) {
|
||||||
|
int insertPos = Math.min(afterLastSourcePos, lastRemovePos);
|
||||||
|
cpelements.addAll(insertPos, srcelements);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastRemovePos != nEntries || !srcelements.isEmpty()) {
|
||||||
|
fCPathList.setElements(cpelements);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElement openNewOutputContainerDialog(CPListElement existing, boolean includeLinked) {
|
||||||
|
if (includeLinked) {
|
||||||
|
NewFolderDialog dialog = new NewFolderDialog(getShell(), fCurrCProject.getProject());
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
IResource createdFolder = (IResource) dialog.getResult()[0];
|
||||||
|
return newCPOutputElement(createdFolder);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String title = (existing == null) ? CPathEntryMessages.getString("SourcePathEntryPage.NewSourceFolderDialog.new.title") //$NON-NLS-1$
|
||||||
|
: CPathEntryMessages.getString("SourcePathEntryPage.NewSourceFolderDialog.edit.title"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
IProject proj = fCurrCProject.getProject();
|
||||||
|
NewSourceFolderDialog dialog = new NewSourceFolderDialog(getShell(), title, proj, getExistingContainers(existing),
|
||||||
|
existing);
|
||||||
|
dialog.setMessage(CPathEntryMessages.getFormattedString("SourcePathEntryPage.NewSourceFolderDialog.description", //$NON-NLS-1$
|
||||||
|
fProjPath.toString()));
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
IResource folder = dialog.getSourceFolder();
|
||||||
|
return newCPOutputElement(folder);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void askForAddingExclusionPatternsDialog(List newEntries, Set modifiedEntries) {
|
||||||
|
fixNestingConflicts(newEntries, fOutputList.getElements(), modifiedEntries);
|
||||||
|
if (!modifiedEntries.isEmpty()) {
|
||||||
|
String title = CPathEntryMessages.getString("OutputPathEntryPage.exclusion_added.title"); //$NON-NLS-1$
|
||||||
|
String message = CPathEntryMessages.getString("OutputPathEntryPage.exclusion_added.message"); //$NON-NLS-1$
|
||||||
|
MessageDialog.openInformation(getShell(), title, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElement[] openOutputContainerDialog(CPListElement existing) {
|
||||||
|
|
||||||
|
Class[] acceptedClasses = new Class[] { IProject.class, IFolder.class};
|
||||||
|
List existingContainers = getExistingContainers(null);
|
||||||
|
|
||||||
|
IProject[] allProjects = fWorkspaceRoot.getProjects();
|
||||||
|
ArrayList rejectedElements = new ArrayList(allProjects.length);
|
||||||
|
IProject currProject = fCurrCProject.getProject();
|
||||||
|
for (int i = 0; i < allProjects.length; i++) {
|
||||||
|
if (!allProjects[i].equals(currProject)) {
|
||||||
|
rejectedElements.add(allProjects[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewerFilter filter = new TypedViewerFilter(acceptedClasses, rejectedElements.toArray());
|
||||||
|
|
||||||
|
ILabelProvider lp = new WorkbenchLabelProvider();
|
||||||
|
ITreeContentProvider cp = new BaseWorkbenchContentProvider();
|
||||||
|
|
||||||
|
String title = (existing == null) ? CPathEntryMessages.getString("OutputPathEntryPage.ExistingOutputFolderDialog.new.title") //$NON-NLS-1$
|
||||||
|
: CPathEntryMessages.getString("OutputPathEntryPage.ExistingOutputFolderDialog.edit.title"); //$NON-NLS-1$
|
||||||
|
String message = (existing == null) ? CPathEntryMessages.getString("OutputPathEntryPage.ExistingOutputFolderDialog.new.description") //$NON-NLS-1$
|
||||||
|
: CPathEntryMessages.getString("OutputPathEntryPage.ExistingOutputFolderDialog.edit.description"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
MultipleFolderSelectionDialog dialog = new MultipleFolderSelectionDialog(getShell(), lp, cp);
|
||||||
|
dialog.setExisting(existingContainers.toArray());
|
||||||
|
dialog.setTitle(title);
|
||||||
|
dialog.setMessage(message);
|
||||||
|
dialog.addFilter(filter);
|
||||||
|
dialog.setInput(fCurrCProject.getProject().getParent());
|
||||||
|
if (existing == null) {
|
||||||
|
dialog.setInitialFocus(fCurrCProject.getProject());
|
||||||
|
} else {
|
||||||
|
dialog.setInitialFocus(existing.getResource());
|
||||||
|
}
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
Object[] elements = dialog.getResult();
|
||||||
|
CPListElement[] res = new CPListElement[elements.length];
|
||||||
|
for (int i = 0; i < res.length; i++) {
|
||||||
|
IResource elem = (IResource) elements[i];
|
||||||
|
res[i] = newCPOutputElement(elem);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List getExistingContainers(CPListElement existing) {
|
||||||
|
List res = new ArrayList();
|
||||||
|
List cplist = fOutputList.getElements();
|
||||||
|
for (int i = 0; i < cplist.size(); i++) {
|
||||||
|
CPListElement elem = (CPListElement) cplist.get(i);
|
||||||
|
if (elem != existing) {
|
||||||
|
IResource resource = elem.getResource();
|
||||||
|
if (resource instanceof IContainer) { // defensive code
|
||||||
|
res.add(resource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElement newCPOutputElement(IResource res) {
|
||||||
|
Assert.isNotNull(res);
|
||||||
|
return new CPListElement(fCurrCProject, IPathEntry.CDT_OUTPUT, res.getFullPath(), res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#getSelection
|
||||||
|
*/
|
||||||
|
public List getSelection() {
|
||||||
|
return fOutputList.getSelectedElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#setSelection
|
||||||
|
*/
|
||||||
|
public void setSelection(List selElements) {
|
||||||
|
fOutputList.selectElements(new StructuredSelection(selElements));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int)
|
||||||
|
*/
|
||||||
|
public boolean isEntryKind(int kind) {
|
||||||
|
return kind == IPathEntry.CDT_OUTPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
|
||||||
|
*/
|
||||||
|
public void performDefaults() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,191 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.ICModel;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.PixelConverter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
|
||||||
|
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.LayoutUtil;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
import org.eclipse.ui.ide.IDE;
|
||||||
|
|
||||||
|
public class CPathProjectsEntryPage extends CPathBasePage {
|
||||||
|
|
||||||
|
private CheckedListDialogField fProjectsList;
|
||||||
|
ICProject fCurrCProject;
|
||||||
|
private ListDialogField fCPathList;
|
||||||
|
|
||||||
|
public CPathProjectsEntryPage(ListDialogField cPathList) {
|
||||||
|
super(CPathEntryMessages.getString("ProjectsEntryPage.title")); //$NON-NLS-1$
|
||||||
|
setDescription(CPathEntryMessages.getString("ProjectsEntryPage.description")); //$NON-NLS-1$
|
||||||
|
ProjectsListListener listener = new ProjectsListListener();
|
||||||
|
|
||||||
|
String[] buttonLabels = new String[] { /* 0 */CPathEntryMessages.getString("ProjectsEntryPage.projects.checkall.button"), //$NON-NLS-1$
|
||||||
|
/* 1 */CPathEntryMessages.getString("ProjectsEntryWorkbookPage.projects.uncheckall.button")}; //$NON-NLS-1$
|
||||||
|
|
||||||
|
fProjectsList = new CheckedListDialogField(null, buttonLabels, new CPListLabelProvider());
|
||||||
|
fProjectsList.setDialogFieldListener(listener);
|
||||||
|
fProjectsList.setLabelText(CPathEntryMessages.getString("ProjectsEntryPage.projects.label")); //$NON-NLS-1$
|
||||||
|
fProjectsList.setCheckAllButtonIndex(0);
|
||||||
|
fProjectsList.setUncheckAllButtonIndex(1);
|
||||||
|
|
||||||
|
fProjectsList.setViewerSorter(new CPListElementSorter());
|
||||||
|
fCPathList = cPathList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Image getImage() {
|
||||||
|
return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
|
||||||
|
*/
|
||||||
|
public void performDefaults() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
PixelConverter converter = new PixelConverter(parent);
|
||||||
|
|
||||||
|
Composite composite = new Composite(parent, SWT.NONE);
|
||||||
|
|
||||||
|
setControl(composite);
|
||||||
|
|
||||||
|
LayoutUtil.doDefaultLayout(composite, new DialogField[] { fProjectsList}, true);
|
||||||
|
LayoutUtil.setHorizontalGrabbing(fProjectsList.getListControl(null));
|
||||||
|
|
||||||
|
int buttonBarWidth = converter.convertWidthInCharsToPixels(24);
|
||||||
|
fProjectsList.setButtonsMinWidth(buttonBarWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ProjectsListListener implements IDialogFieldListener {
|
||||||
|
|
||||||
|
// ---------- IDialogFieldListener --------
|
||||||
|
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
if (fCurrCProject != null) {
|
||||||
|
// already initialized
|
||||||
|
updateCPathList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(ICProject cproject) {
|
||||||
|
updateProjectsList(cproject);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateProjectsList(ICProject currCProject) {
|
||||||
|
ICModel cmodel = currCProject.getCModel();
|
||||||
|
ICProject[] cprojects = cmodel.getCProjects();
|
||||||
|
|
||||||
|
List projects = new ArrayList(cprojects.length);
|
||||||
|
|
||||||
|
// a vector remembering all projects that dont have to be added anymore
|
||||||
|
List existingProjects = new ArrayList(cprojects.length);
|
||||||
|
existingProjects.add(currCProject.getProject());
|
||||||
|
|
||||||
|
final List checkedProjects = new ArrayList(cprojects.length);
|
||||||
|
// add the projects-cpentries that are already on the C Path
|
||||||
|
List cpelements = fCPathList.getElements();
|
||||||
|
for (int i = cpelements.size() - 1; i >= 0; i--) {
|
||||||
|
CPListElement cpelem = (CPListElement) cpelements.get(i);
|
||||||
|
if (isEntryKind(cpelem.getEntryKind())) {
|
||||||
|
existingProjects.add(cpelem.getResource());
|
||||||
|
projects.add(cpelem);
|
||||||
|
checkedProjects.add(cpelem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < cprojects.length; i++) {
|
||||||
|
IProject proj = cprojects[i].getProject();
|
||||||
|
if (!existingProjects.contains(proj)) {
|
||||||
|
projects.add(new CPListElement(fCurrCProject, IPathEntry.CDT_PROJECT, proj.getFullPath(), proj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fProjectsList.setElements(projects);
|
||||||
|
fProjectsList.setCheckedElements(checkedProjects);
|
||||||
|
fCurrCProject = currCProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateCPathList() {
|
||||||
|
List projelements = fProjectsList.getCheckedElements();
|
||||||
|
|
||||||
|
boolean remove = false;
|
||||||
|
List pelements = fCPathList.getElements();
|
||||||
|
// backwards, as entries will be deleted
|
||||||
|
for (int i = pelements.size() - 1; i >= 0; i--) {
|
||||||
|
CPListElement pe = (CPListElement) pelements.get(i);
|
||||||
|
if (isEntryKind(pe.getEntryKind())) {
|
||||||
|
if (!projelements.remove(pe)) {
|
||||||
|
pelements.remove(i);
|
||||||
|
remove = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < projelements.size(); i++) {
|
||||||
|
pelements.add(projelements.get(i));
|
||||||
|
}
|
||||||
|
if (remove || (projelements.size() > 0)) {
|
||||||
|
fCPathList.setElements(pelements);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#getSelection
|
||||||
|
*/
|
||||||
|
public List getSelection() {
|
||||||
|
return fProjectsList.getSelectedElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#setSelection
|
||||||
|
*/
|
||||||
|
public void setSelection(List selElements) {
|
||||||
|
fProjectsList.selectElements(new StructuredSelection(selElements));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int)
|
||||||
|
*/
|
||||||
|
public boolean isEntryKind(int kind) {
|
||||||
|
return kind == IPathEntry.CDT_PROJECT;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,214 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.CProjectNature;
|
||||||
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusUtil;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogSettings;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
|
||||||
|
import org.eclipse.jface.operation.IRunnableWithProgress;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
|
||||||
|
import org.eclipse.ui.dialogs.PropertyPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PropertyPage
|
||||||
|
*/
|
||||||
|
public class CPathPropertyPage extends PropertyPage implements IStatusChangeListener {
|
||||||
|
|
||||||
|
private static final String PAGE_SETTINGS = "CPathsPropertyPage"; //$NON-NLS-1$
|
||||||
|
private static final String INDEX = "pageIndex"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
CPathTabBlock fCPathsBlock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see PropertyPage#createContents
|
||||||
|
*/
|
||||||
|
protected Control createContents(Composite parent) {
|
||||||
|
IProject project = getProject();
|
||||||
|
Control result;
|
||||||
|
if (project == null || !isCProject(project)) {
|
||||||
|
result = createWithoutCProject(parent);
|
||||||
|
} else if (!project.isOpen()) {
|
||||||
|
result = createForClosedProject(parent);
|
||||||
|
} else {
|
||||||
|
result = createWithCProject(parent, project);
|
||||||
|
}
|
||||||
|
Dialog.applyDialogFont(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDialogSettings getSettings() {
|
||||||
|
IDialogSettings cSettings = CUIPlugin.getDefault().getDialogSettings();
|
||||||
|
IDialogSettings pageSettings = cSettings.getSection(PAGE_SETTINGS);
|
||||||
|
if (pageSettings == null) {
|
||||||
|
pageSettings = cSettings.addNewSection(PAGE_SETTINGS);
|
||||||
|
pageSettings.put(INDEX, 3);
|
||||||
|
}
|
||||||
|
return pageSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Content for valid projects.
|
||||||
|
*/
|
||||||
|
private Control createWithCProject(Composite parent, IProject project) {
|
||||||
|
fCPathsBlock = new CPathTabBlock(this, getSettings().getInt(INDEX));
|
||||||
|
fCPathsBlock.init(CoreModel.getDefault().create(project), null);
|
||||||
|
return fCPathsBlock.createContents(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Content for non-C projects.
|
||||||
|
*/
|
||||||
|
private Control createWithoutCProject(Composite parent) {
|
||||||
|
Label label = new Label(parent, SWT.LEFT);
|
||||||
|
label.setText(CPathEntryMessages.getString("CPathsPropertyPage.no_C_project.message")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fCPathsBlock = null;
|
||||||
|
setValid(true);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Content for closed projects.
|
||||||
|
*/
|
||||||
|
private Control createForClosedProject(Composite parent) {
|
||||||
|
Label label = new Label(parent, SWT.LEFT);
|
||||||
|
label.setText(CPathEntryMessages.getString("CPathsPropertyPage.closed_project.message")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fCPathsBlock = null;
|
||||||
|
setValid(true);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVisible(boolean visible) {
|
||||||
|
if (fCPathsBlock != null) {
|
||||||
|
if (!visible) {
|
||||||
|
if (fCPathsBlock.hasChangesInDialog()) {
|
||||||
|
String title= CPathEntryMessages.getString("CPathsPropertyPage.unsavedchanges.title"); //$NON-NLS-1$
|
||||||
|
String message= CPathEntryMessages.getString("CPathsPropertyPage.unsavedchanges.message"); //$NON-NLS-1$
|
||||||
|
String[] buttonLabels= new String[] {
|
||||||
|
CPathEntryMessages.getString("CPathsPropertyPage.unsavedchanges.button.save"), //$NON-NLS-1$
|
||||||
|
CPathEntryMessages.getString("CPathsPropertyPage.unsavedchanges.button.discard"), //$NON-NLS-1$
|
||||||
|
CPathEntryMessages.getString("CPathsPropertyPage.unsavedchanges.button.ignore") //$NON-NLS-1$
|
||||||
|
};
|
||||||
|
MessageDialog dialog= new MessageDialog(getShell(), title, null, message, MessageDialog.QUESTION, buttonLabels, 0);
|
||||||
|
int res= dialog.open();
|
||||||
|
if (res == 0) {
|
||||||
|
performOk();
|
||||||
|
} else if (res == 1) {
|
||||||
|
fCPathsBlock.init(CoreModel.getDefault().create(getProject()), null);
|
||||||
|
} else {
|
||||||
|
fCPathsBlock.initializeTimeStamps();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!fCPathsBlock.hasChangesInDialog() && fCPathsBlock.hasChangesInCPathFile()) {
|
||||||
|
fCPathsBlock.init(CoreModel.getDefault().create(getProject()), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.setVisible(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IProject getProject() {
|
||||||
|
IAdaptable adaptable = getElement();
|
||||||
|
if (adaptable != null) {
|
||||||
|
ICElement elem = (ICElement) adaptable.getAdapter(ICElement.class);
|
||||||
|
if (elem instanceof ICProject) {
|
||||||
|
return ((ICProject) elem).getProject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCProject(IProject proj) {
|
||||||
|
try {
|
||||||
|
return proj.hasNature(CProjectNature.C_NATURE_ID);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CUIPlugin.getDefault().log(e);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see IPreferencePage#performOk
|
||||||
|
*/
|
||||||
|
public boolean performOk() {
|
||||||
|
if (fCPathsBlock != null) {
|
||||||
|
getSettings().put(INDEX, fCPathsBlock.getPageIndex());
|
||||||
|
|
||||||
|
Shell shell = getControl().getShell();
|
||||||
|
IRunnableWithProgress runnable = new IRunnableWithProgress() {
|
||||||
|
|
||||||
|
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
|
||||||
|
try {
|
||||||
|
fCPathsBlock.configureCProject(monitor);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
throw new InvocationTargetException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(runnable);
|
||||||
|
try {
|
||||||
|
new ProgressMonitorDialog(shell).run(true, true, op);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
String title = CPathEntryMessages.getString("CPathsPropertyPage.error.title"); //$NON-NLS-1$
|
||||||
|
String message = CPathEntryMessages.getString("CPathsPropertyPage.error.message"); //$NON-NLS-1$
|
||||||
|
ExceptionHandler.handle(e, shell, title, message);
|
||||||
|
return false;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// cancelled
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see IStatusChangeListener#statusChanged
|
||||||
|
*/
|
||||||
|
public void statusChanged(IStatus status) {
|
||||||
|
setValid(!status.matches(IStatus.ERROR));
|
||||||
|
StatusUtil.applyToStatusLine(this, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jface.preference.IPreferencePage#performCancel()
|
||||||
|
*/
|
||||||
|
public boolean performCancel() {
|
||||||
|
if (fCPathsBlock != null) {
|
||||||
|
getSettings().put(INDEX, fCPathsBlock.getPageIndex());
|
||||||
|
}
|
||||||
|
return super.performCancel();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,560 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.PixelConverter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.TypedViewerFilter;
|
||||||
|
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.ITreeListAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.TreeListDialogField;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IFolder;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
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;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.ui.dialogs.NewFolderDialog;
|
||||||
|
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
|
||||||
|
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
||||||
|
|
||||||
|
public class CPathSourceEntryPage extends CPathBasePage {
|
||||||
|
|
||||||
|
private ListDialogField fClassPathList;
|
||||||
|
private ICProject fCurrCProject;
|
||||||
|
private IPath fProjPath;
|
||||||
|
|
||||||
|
private IWorkspaceRoot fWorkspaceRoot;
|
||||||
|
|
||||||
|
private TreeListDialogField fFoldersList;
|
||||||
|
|
||||||
|
private final int IDX_ADD = 0;
|
||||||
|
private final int IDX_EDIT = 2;
|
||||||
|
private final int IDX_REMOVE = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param title
|
||||||
|
*/
|
||||||
|
public CPathSourceEntryPage(ListDialogField classPathList) {
|
||||||
|
super(CPathEntryMessages.getString("SourcePathEntryPage.title")); //$NON-NLS-1$
|
||||||
|
setDescription(CPathEntryMessages.getString("SourcePathEntryPage.description")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fWorkspaceRoot = CUIPlugin.getWorkspace().getRoot();
|
||||||
|
fClassPathList = classPathList;
|
||||||
|
|
||||||
|
SourceContainerAdapter adapter = new SourceContainerAdapter();
|
||||||
|
|
||||||
|
String[] buttonLabels;
|
||||||
|
|
||||||
|
buttonLabels = new String[] {
|
||||||
|
/* 0 = IDX_ADDEXIST */CPathEntryMessages.getString("SourcePathEntryPage.folders.add.button"), //$NON-NLS-1$
|
||||||
|
/* 1 */null, /* 2 = IDX_EDIT */CPathEntryMessages.getString("SourcePathEntryPath.folders.edit.button"), //$NON-NLS-1$
|
||||||
|
/* 3 = IDX_REMOVE */CPathEntryMessages.getString("SourcePathEntryPage.folders.remove.button") //$NON-NLS-1$
|
||||||
|
};
|
||||||
|
|
||||||
|
fFoldersList = new TreeListDialogField(adapter, buttonLabels, new CPListLabelProvider());
|
||||||
|
fFoldersList.setDialogFieldListener(adapter);
|
||||||
|
fFoldersList.setLabelText(CPathEntryMessages.getString("SourcePathEntryPage.folders.label")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fFoldersList.setViewerSorter(new CPListElementSorter());
|
||||||
|
fFoldersList.enableButton(IDX_EDIT, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Image getImage() {
|
||||||
|
return CPluginImages.get(CPluginImages.IMG_OBJS_SOURCE_ROOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(ICProject cproject) {
|
||||||
|
fCurrCProject = cproject;
|
||||||
|
fProjPath = fCurrCProject.getProject().getFullPath();
|
||||||
|
updateFoldersList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateFoldersList() {
|
||||||
|
ArrayList folders = new ArrayList();
|
||||||
|
|
||||||
|
List cpelements = fClassPathList.getElements();
|
||||||
|
for (int i = 0; i < cpelements.size(); i++) {
|
||||||
|
CPListElement cpe = (CPListElement) cpelements.get(i);
|
||||||
|
if (cpe.getEntryKind() == IPathEntry.CDT_SOURCE) {
|
||||||
|
folders.add(cpe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fFoldersList.setElements(folders);
|
||||||
|
|
||||||
|
for (int i = 0; i < folders.size(); i++) {
|
||||||
|
CPListElement cpe = (CPListElement) folders.get(i);
|
||||||
|
IPath[] patterns = (IPath[]) cpe.getAttribute(CPListElement.EXCLUSION);
|
||||||
|
if (patterns.length > 0) {
|
||||||
|
fFoldersList.expandElement(cpe, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
PixelConverter converter = new PixelConverter(parent);
|
||||||
|
Composite composite = new Composite(parent, SWT.NONE);
|
||||||
|
|
||||||
|
LayoutUtil.doDefaultLayout(composite, new DialogField[] { fFoldersList}, true);
|
||||||
|
LayoutUtil.setHorizontalGrabbing(fFoldersList.getTreeControl(null));
|
||||||
|
|
||||||
|
int buttonBarWidth = converter.convertWidthInCharsToPixels(24);
|
||||||
|
fFoldersList.setButtonsMinWidth(buttonBarWidth);
|
||||||
|
|
||||||
|
// expand
|
||||||
|
List elements = fFoldersList.getElements();
|
||||||
|
for (int i = 0; i < elements.size(); i++) {
|
||||||
|
CPListElement elem = (CPListElement) elements.get(i);
|
||||||
|
IPath[] patterns = (IPath[]) elem.getAttribute(CPListElement.EXCLUSION);
|
||||||
|
if (patterns.length > 0) {
|
||||||
|
fFoldersList.expandElement(elem, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setControl(composite);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SourceContainerAdapter implements ITreeListAdapter, IDialogFieldListener {
|
||||||
|
|
||||||
|
private final Object[] EMPTY_ARR = new Object[0];
|
||||||
|
|
||||||
|
// -------- IListAdapter --------
|
||||||
|
public void customButtonPressed(TreeListDialogField field, int index) {
|
||||||
|
sourcePageCustomButtonPressed(field, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectionChanged(TreeListDialogField field) {
|
||||||
|
sourcePageSelectionChanged(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doubleClicked(TreeListDialogField field) {
|
||||||
|
sourcePageDoubleClicked(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void keyPressed(TreeListDialogField field, KeyEvent event) {
|
||||||
|
sourcePageKeyPressed(field, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getChildren(TreeListDialogField field, Object element) {
|
||||||
|
if (element instanceof CPListElement) {
|
||||||
|
return ((CPListElement) element).getChildren();
|
||||||
|
}
|
||||||
|
return EMPTY_ARR;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getParent(TreeListDialogField field, Object element) {
|
||||||
|
if (element instanceof CPListElementAttribute) {
|
||||||
|
return ((CPListElementAttribute) element).getParent();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChildren(TreeListDialogField field, Object element) {
|
||||||
|
return (element instanceof CPListElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- IDialogFieldListener --------
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
sourcePageDialogFieldChanged(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sourcePageKeyPressed(TreeListDialogField field, KeyEvent event) {
|
||||||
|
if (field == fFoldersList) {
|
||||||
|
if (event.character == SWT.DEL && event.stateMask == 0) {
|
||||||
|
List selection = field.getSelectedElements();
|
||||||
|
if (canRemove(selection)) {
|
||||||
|
removeEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sourcePageDoubleClicked(TreeListDialogField field) {
|
||||||
|
if (field == fFoldersList) {
|
||||||
|
List selection = field.getSelectedElements();
|
||||||
|
if (canEdit(selection)) {
|
||||||
|
editEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasFolders(IContainer container) {
|
||||||
|
try {
|
||||||
|
IResource[] members = container.members();
|
||||||
|
for (int i = 0; i < members.length; i++) {
|
||||||
|
if (members[i] instanceof IContainer) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CoreException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sourcePageCustomButtonPressed(DialogField field, int index) {
|
||||||
|
if (field == fFoldersList) {
|
||||||
|
if (index == IDX_ADD) {
|
||||||
|
List elementsToAdd = new ArrayList(10);
|
||||||
|
IProject project = fCurrCProject.getProject();
|
||||||
|
if (project.exists()) {
|
||||||
|
if (hasFolders(project)) {
|
||||||
|
CPListElement[] srcentries = openSourceContainerDialog(null);
|
||||||
|
if (srcentries != null) {
|
||||||
|
for (int i = 0; i < srcentries.length; i++) {
|
||||||
|
elementsToAdd.add(srcentries[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CPListElement entry = openNewSourceContainerDialog(null, true);
|
||||||
|
if (entry != null) {
|
||||||
|
elementsToAdd.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CPListElement entry = openNewSourceContainerDialog(null, false);
|
||||||
|
if (entry != null) {
|
||||||
|
elementsToAdd.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!elementsToAdd.isEmpty()) {
|
||||||
|
HashSet modifiedElements = new HashSet();
|
||||||
|
askForAddingExclusionPatternsDialog(elementsToAdd, modifiedElements);
|
||||||
|
|
||||||
|
fFoldersList.addElements(elementsToAdd);
|
||||||
|
fFoldersList.postSetSelection(new StructuredSelection(elementsToAdd));
|
||||||
|
|
||||||
|
if (!modifiedElements.isEmpty()) {
|
||||||
|
for (Iterator iter = modifiedElements.iterator(); iter.hasNext();) {
|
||||||
|
Object elem = iter.next();
|
||||||
|
fFoldersList.refresh(elem);
|
||||||
|
fFoldersList.expandElement(elem, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else if (index == IDX_EDIT) {
|
||||||
|
editEntry();
|
||||||
|
} else if (index == IDX_REMOVE) {
|
||||||
|
removeEntry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editEntry() {
|
||||||
|
List selElements = fFoldersList.getSelectedElements();
|
||||||
|
if (selElements.size() != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Object elem = selElements.get(0);
|
||||||
|
if (fFoldersList.getIndexOfElement(elem) != -1) {
|
||||||
|
editElementEntry((CPListElement) elem);
|
||||||
|
} else if (elem instanceof CPListElementAttribute) {
|
||||||
|
editAttributeEntry((CPListElementAttribute) elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editElementEntry(CPListElement elem) {
|
||||||
|
CPListElement res = null;
|
||||||
|
|
||||||
|
res = openNewSourceContainerDialog(elem, true);
|
||||||
|
|
||||||
|
if (res != null) {
|
||||||
|
fFoldersList.replaceElement(elem, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editAttributeEntry(CPListElementAttribute elem) {
|
||||||
|
String key = elem.getKey();
|
||||||
|
if (key.equals(CPListElement.EXCLUSION)) {
|
||||||
|
CPListElement selElement = elem.getParent();
|
||||||
|
ExclusionPatternDialog dialog = new ExclusionPatternDialog(getShell(), selElement);
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
selElement.setAttribute(CPListElement.EXCLUSION, dialog.getExclusionPattern());
|
||||||
|
fFoldersList.refresh();
|
||||||
|
fClassPathList.dialogFieldChanged(); // validate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void sourcePageSelectionChanged(DialogField field) {
|
||||||
|
List selected = fFoldersList.getSelectedElements();
|
||||||
|
fFoldersList.enableButton(IDX_EDIT, canEdit(selected));
|
||||||
|
fFoldersList.enableButton(IDX_REMOVE, canRemove(selected));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeEntry() {
|
||||||
|
List selElements = fFoldersList.getSelectedElements();
|
||||||
|
for (int i = selElements.size() - 1; i >= 0; i--) {
|
||||||
|
Object elem = selElements.get(i);
|
||||||
|
if (elem instanceof CPListElementAttribute) {
|
||||||
|
CPListElementAttribute attrib = (CPListElementAttribute) elem;
|
||||||
|
String key = attrib.getKey();
|
||||||
|
Object value = key.equals(CPListElement.EXCLUSION) ? new Path[0] : null;
|
||||||
|
attrib.getParent().setAttribute(key, value);
|
||||||
|
selElements.remove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selElements.isEmpty()) {
|
||||||
|
fFoldersList.refresh();
|
||||||
|
fClassPathList.dialogFieldChanged(); // validate
|
||||||
|
} else {
|
||||||
|
fFoldersList.removeElements(selElements);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canRemove(List selElements) {
|
||||||
|
if (selElements.size() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < selElements.size(); i++) {
|
||||||
|
Object elem = selElements.get(i);
|
||||||
|
if (elem instanceof CPListElementAttribute) {
|
||||||
|
CPListElementAttribute attrib = (CPListElementAttribute) elem;
|
||||||
|
if (attrib.getKey().equals(CPListElement.EXCLUSION)) {
|
||||||
|
if (((IPath[]) attrib.getValue()).length == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (attrib.getValue() == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (elem instanceof CPListElement) {
|
||||||
|
CPListElement curr = (CPListElement) elem;
|
||||||
|
if (curr.getParentContainer() != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canEdit(List selElements) {
|
||||||
|
if (selElements.size() != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Object elem = selElements.get(0);
|
||||||
|
if (elem instanceof CPListElement) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (elem instanceof CPListElementAttribute) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sourcePageDialogFieldChanged(DialogField field) {
|
||||||
|
if (fCurrCProject == null) {
|
||||||
|
// not initialized
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (field == fFoldersList) {
|
||||||
|
updateClasspathList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateClasspathList() {
|
||||||
|
List srcelements = fFoldersList.getElements();
|
||||||
|
|
||||||
|
List cpelements = fClassPathList.getElements();
|
||||||
|
int nEntries = cpelements.size();
|
||||||
|
// backwards, as entries will be deleted
|
||||||
|
int lastRemovePos = nEntries;
|
||||||
|
int afterLastSourcePos = 0;
|
||||||
|
for (int i = nEntries - 1; i >= 0; i--) {
|
||||||
|
CPListElement cpe = (CPListElement) cpelements.get(i);
|
||||||
|
int kind = cpe.getEntryKind();
|
||||||
|
if (isEntryKind(kind)) {
|
||||||
|
if (!srcelements.remove(cpe)) {
|
||||||
|
cpelements.remove(i);
|
||||||
|
lastRemovePos = i;
|
||||||
|
} else if (lastRemovePos == nEntries) {
|
||||||
|
afterLastSourcePos = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!srcelements.isEmpty()) {
|
||||||
|
int insertPos = Math.min(afterLastSourcePos, lastRemovePos);
|
||||||
|
cpelements.addAll(insertPos, srcelements);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastRemovePos != nEntries || !srcelements.isEmpty()) {
|
||||||
|
fClassPathList.setElements(cpelements);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElement openNewSourceContainerDialog(CPListElement existing, boolean includeLinked) {
|
||||||
|
if (includeLinked) {
|
||||||
|
NewFolderDialog dialog = new NewFolderDialog(getShell(), fCurrCProject.getProject());
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
IResource createdFolder = (IResource) dialog.getResult()[0];
|
||||||
|
return newCPSourceElement(createdFolder);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String title = (existing == null) ? CPathEntryMessages.getString("SourcePathEntryPage.NewSourceFolderDialog.new.title") //$NON-NLS-1$
|
||||||
|
: CPathEntryMessages.getString("SourcePathEntryPage.NewSourceFolderDialog.edit.title"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
IProject proj = fCurrCProject.getProject();
|
||||||
|
NewSourceFolderDialog dialog = new NewSourceFolderDialog(getShell(), title, proj, getExistingContainers(existing),
|
||||||
|
existing);
|
||||||
|
dialog.setMessage(CPathEntryMessages.getFormattedString("SourcePathEntryPage.NewSourceFolderDialog.description", //$NON-NLS-1$
|
||||||
|
fProjPath.toString()));
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
IResource folder = dialog.getSourceFolder();
|
||||||
|
return newCPSourceElement(folder);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void askForAddingExclusionPatternsDialog(List newEntries, Set modifiedEntries) {
|
||||||
|
fixNestingConflicts(newEntries, fFoldersList.getElements(), modifiedEntries);
|
||||||
|
if (!modifiedEntries.isEmpty()) {
|
||||||
|
String title = CPathEntryMessages.getString("SourcePathEntryPage.exclusion_added.title"); //$NON-NLS-1$
|
||||||
|
String message = CPathEntryMessages.getString("SourcePathEntryPage.exclusion_added.message"); //$NON-NLS-1$
|
||||||
|
MessageDialog.openInformation(getShell(), title, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElement[] openSourceContainerDialog(CPListElement existing) {
|
||||||
|
|
||||||
|
Class[] acceptedClasses = new Class[] { IProject.class, IFolder.class};
|
||||||
|
List existingContainers = getExistingContainers(null);
|
||||||
|
|
||||||
|
IProject[] allProjects = fWorkspaceRoot.getProjects();
|
||||||
|
ArrayList rejectedElements = new ArrayList(allProjects.length);
|
||||||
|
IProject currProject = fCurrCProject.getProject();
|
||||||
|
for (int i = 0; i < allProjects.length; i++) {
|
||||||
|
if (!allProjects[i].equals(currProject)) {
|
||||||
|
rejectedElements.add(allProjects[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewerFilter filter = new TypedViewerFilter(acceptedClasses, rejectedElements.toArray());
|
||||||
|
|
||||||
|
ILabelProvider lp = new WorkbenchLabelProvider();
|
||||||
|
ITreeContentProvider cp = new BaseWorkbenchContentProvider();
|
||||||
|
|
||||||
|
String title = (existing == null) ? CPathEntryMessages.getString("SourcePathEntryPage.ExistingSourceFolderDialog.new.title") //$NON-NLS-1$
|
||||||
|
: CPathEntryMessages.getString("SourcePathEntryPage.ExistingSourceFolderDialog.edit.title"); //$NON-NLS-1$
|
||||||
|
String message = (existing == null) ? CPathEntryMessages.getString("SourcePathEntryPage.ExistingSourceFolderDialog.new.description") //$NON-NLS-1$
|
||||||
|
: CPathEntryMessages.getString("SourcePathEntryPage.ExistingSourceFolderDialog.edit.description"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
MultipleFolderSelectionDialog dialog = new MultipleFolderSelectionDialog(getShell(), lp, cp);
|
||||||
|
dialog.setExisting(existingContainers.toArray());
|
||||||
|
dialog.setTitle(title);
|
||||||
|
dialog.setMessage(message);
|
||||||
|
dialog.addFilter(filter);
|
||||||
|
dialog.setInput(fCurrCProject.getProject().getParent());
|
||||||
|
if (existing == null) {
|
||||||
|
dialog.setInitialFocus(fCurrCProject.getProject());
|
||||||
|
} else {
|
||||||
|
dialog.setInitialFocus(existing.getResource());
|
||||||
|
}
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
Object[] elements = dialog.getResult();
|
||||||
|
CPListElement[] res = new CPListElement[elements.length];
|
||||||
|
for (int i = 0; i < res.length; i++) {
|
||||||
|
IResource elem = (IResource) elements[i];
|
||||||
|
res[i] = newCPSourceElement(elem);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List getExistingContainers(CPListElement existing) {
|
||||||
|
List res = new ArrayList();
|
||||||
|
List cplist = fFoldersList.getElements();
|
||||||
|
for (int i = 0; i < cplist.size(); i++) {
|
||||||
|
CPListElement elem = (CPListElement) cplist.get(i);
|
||||||
|
if (elem != existing) {
|
||||||
|
IResource resource = elem.getResource();
|
||||||
|
if (resource instanceof IContainer) { // defensive code
|
||||||
|
res.add(resource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CPListElement newCPSourceElement(IResource res) {
|
||||||
|
Assert.isNotNull(res);
|
||||||
|
return new CPListElement(fCurrCProject, IPathEntry.CDT_SOURCE, res.getFullPath(), res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#getSelection
|
||||||
|
*/
|
||||||
|
public List getSelection() {
|
||||||
|
return fFoldersList.getSelectedElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see BuildPathBasePage#setSelection
|
||||||
|
*/
|
||||||
|
public void setSelection(List selElements) {
|
||||||
|
fFoldersList.selectElements(new StructuredSelection(selElements));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int)
|
||||||
|
*/
|
||||||
|
public boolean isEntryKind(int kind) {
|
||||||
|
return kind == IPathEntry.CDT_SOURCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.AbstractCOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public void performApply(IProgressMonitor monitor) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.AbstractCOptionPage#performDefaults()
|
||||||
|
*/
|
||||||
|
public void performDefaults() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,511 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.ICModelStatus;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.IPathEntry;
|
||||||
|
import org.eclipse.cdt.internal.core.model.CModelStatus;
|
||||||
|
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.wizards.dialogfields.CheckedListDialogField;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
|
||||||
|
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
|
||||||
|
import org.eclipse.cdt.ui.dialogs.ICOptionPage;
|
||||||
|
import org.eclipse.cdt.ui.dialogs.TabFolderOptionBlock;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IFolder;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
|
||||||
|
public class CPathTabBlock extends TabFolderOptionBlock implements ICOptionContainer {
|
||||||
|
|
||||||
|
private CheckedListDialogField fCPathList;
|
||||||
|
|
||||||
|
private StatusInfo fCPathStatus;
|
||||||
|
private StatusInfo fBuildPathStatus;
|
||||||
|
|
||||||
|
private ICProject fCurrCProject;
|
||||||
|
|
||||||
|
private String fUserSettingsTimeStamp;
|
||||||
|
private long fFileTimeStamp;
|
||||||
|
|
||||||
|
private int fPageIndex, fPageCount;
|
||||||
|
|
||||||
|
private CPathSourceEntryPage fSourcePage;
|
||||||
|
private CPathProjectsEntryPage fProjectsPage;
|
||||||
|
private CPathOutputEntryPage fOutputPage;
|
||||||
|
//private LibrariesWorkbookPage fLibrariesPage;
|
||||||
|
|
||||||
|
private CPathBasePage fCurrPage;
|
||||||
|
|
||||||
|
private IStatusChangeListener fContext;
|
||||||
|
|
||||||
|
private CPathOrderExportPage fOrderExportPage;
|
||||||
|
|
||||||
|
private class BuildPathAdapter implements IDialogFieldListener {
|
||||||
|
|
||||||
|
// ---------- IDialogFieldListener --------
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
buildPathDialogFieldChanged(field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void buildPathDialogFieldChanged(DialogField field) {
|
||||||
|
if (field == fCPathList) {
|
||||||
|
updateClassPathStatus();
|
||||||
|
}
|
||||||
|
doStatusLineUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CPathTabBlock(IStatusChangeListener context, int pageToShow) {
|
||||||
|
super(true);
|
||||||
|
fContext = context;
|
||||||
|
fPageIndex = pageToShow;
|
||||||
|
|
||||||
|
String[] buttonLabels = new String[] { /* 0 */CPathEntryMessages.getString("CPathsBlock.path.up.button"), //$NON-NLS-1$
|
||||||
|
/* 1 */CPathEntryMessages.getString("CPathsBlock.path.down.button"), //$NON-NLS-1$
|
||||||
|
/* 2 */null, /* 3 */CPathEntryMessages.getString("CPathsBlock.path.checkall.button"), //$NON-NLS-1$
|
||||||
|
/* 4 */CPathEntryMessages.getString("CPathsBlock.path.uncheckall.button") //$NON-NLS-1$
|
||||||
|
|
||||||
|
};
|
||||||
|
BuildPathAdapter adapter = new BuildPathAdapter();
|
||||||
|
|
||||||
|
fCPathList = new CheckedListDialogField(null, buttonLabels, new CPListLabelProvider());
|
||||||
|
fCPathList.setDialogFieldListener(adapter);
|
||||||
|
fCPathList.setLabelText(CPathEntryMessages.getString("CPathsBlock.path.label")); //$NON-NLS-1$
|
||||||
|
fCPathList.setUpButtonIndex(0);
|
||||||
|
fCPathList.setDownButtonIndex(1);
|
||||||
|
fCPathList.setCheckAllButtonIndex(3);
|
||||||
|
fCPathList.setUncheckAllButtonIndex(4);
|
||||||
|
|
||||||
|
fCPathStatus = new StatusInfo();
|
||||||
|
fBuildPathStatus = new StatusInfo();
|
||||||
|
|
||||||
|
fCurrCProject = null;
|
||||||
|
setOptionContainer(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addTabs() {
|
||||||
|
fSourcePage = new CPathSourceEntryPage(fCPathList);
|
||||||
|
addPage(fSourcePage);
|
||||||
|
fOutputPage = new CPathOutputEntryPage(fCPathList);
|
||||||
|
addPage(fOutputPage);
|
||||||
|
fProjectsPage = new CPathProjectsEntryPage(fCPathList);
|
||||||
|
addPage(fProjectsPage);
|
||||||
|
fOrderExportPage = new CPathOrderExportPage(fCPathList);
|
||||||
|
addPage(fOrderExportPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addPage(CPathBasePage page) {
|
||||||
|
addTab(page);
|
||||||
|
if (fPageIndex == fPageCount) {
|
||||||
|
fCurrPage = page;
|
||||||
|
}
|
||||||
|
fPageCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.TabFolderOptionBlock#getStartPage()
|
||||||
|
*/
|
||||||
|
protected ICOptionPage getStartPage() {
|
||||||
|
if (fCurrPage == null) {
|
||||||
|
return super.getStartPage();
|
||||||
|
}
|
||||||
|
return fCurrPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.TabFolderOptionBlock#createContents(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
public Control createContents(Composite parent) {
|
||||||
|
Control control = super.createContents(parent);
|
||||||
|
if (fCurrCProject != null) {
|
||||||
|
fSourcePage.init(fCurrCProject);
|
||||||
|
fOutputPage.init(fCurrCProject);
|
||||||
|
fProjectsPage.init(fCurrCProject);
|
||||||
|
//fLibrariesPage.init(fCurrCProject);
|
||||||
|
}
|
||||||
|
Dialog.applyDialogFont(control);
|
||||||
|
return control;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the classpath for the given project. Multiple calls to init
|
||||||
|
* are allowed, but all existing settings will be cleared and replace by the
|
||||||
|
* given or default paths.
|
||||||
|
*
|
||||||
|
* @param jproject
|
||||||
|
* The java project to configure. Does not have to exist.
|
||||||
|
* @param outputLocation
|
||||||
|
* The output location to be set in the page. If <code>null</code>
|
||||||
|
* is passed, jdt default settings are used, or - if the project is
|
||||||
|
* an existing Java project- the output location of the existing
|
||||||
|
* project
|
||||||
|
* @param classpathEntries
|
||||||
|
* The classpath entries to be set in the page. If <code>null</code>
|
||||||
|
* is passed, jdt default settings are used, or - if the project is
|
||||||
|
* an existing Java project - the classpath entries of the existing
|
||||||
|
* project
|
||||||
|
*/
|
||||||
|
public void init(ICProject cproject, IPathEntry[] cpathEntries) {
|
||||||
|
fCurrCProject = cproject;
|
||||||
|
boolean projectExists = false;
|
||||||
|
List newClassPath = null;
|
||||||
|
|
||||||
|
IProject project = fCurrCProject.getProject();
|
||||||
|
projectExists = (project.exists() && project.getFile(".cdtproject").exists()); //$NON-NLS-1$
|
||||||
|
if (projectExists) {
|
||||||
|
if (cpathEntries == null) {
|
||||||
|
try {
|
||||||
|
cpathEntries = fCurrCProject.getRawPathEntries();
|
||||||
|
} catch (CModelException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cpathEntries != null) {
|
||||||
|
newClassPath = getExistingEntries(cpathEntries);
|
||||||
|
}
|
||||||
|
if (newClassPath == null) {
|
||||||
|
newClassPath = getDefaultCPath(cproject);
|
||||||
|
}
|
||||||
|
|
||||||
|
List exportedEntries = new ArrayList();
|
||||||
|
for (int i = 0; i < newClassPath.size(); i++) {
|
||||||
|
CPListElement curr = (CPListElement) newClassPath.get(i);
|
||||||
|
if (curr.isExported() && curr.getEntryKind() != IPathEntry.CDT_SOURCE) {
|
||||||
|
exportedEntries.add(curr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fCPathList.setElements(newClassPath);
|
||||||
|
fCPathList.setCheckedElements(exportedEntries);
|
||||||
|
|
||||||
|
if (fProjectsPage != null) {
|
||||||
|
fSourcePage.init(fCurrCProject);
|
||||||
|
fOutputPage.init(fCurrCProject);
|
||||||
|
fProjectsPage.init(fCurrCProject);
|
||||||
|
// fLibrariesPage.init(fCurrCProject);
|
||||||
|
}
|
||||||
|
|
||||||
|
doStatusLineUpdate();
|
||||||
|
initializeTimeStamps();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList getExistingEntries(IPathEntry[] cPathEntries) {
|
||||||
|
ArrayList newCPath = new ArrayList();
|
||||||
|
for (int i = 0; i < cPathEntries.length; i++) {
|
||||||
|
IPathEntry curr = cPathEntries[i];
|
||||||
|
newCPath.add(CPListElement.createFromExisting(curr, fCurrCProject));
|
||||||
|
}
|
||||||
|
return newCPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEncodedSettings() {
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
|
||||||
|
int nElements = fCPathList.getSize();
|
||||||
|
buf.append('[').append(nElements).append(']');
|
||||||
|
for (int i = 0; i < nElements; i++) {
|
||||||
|
CPListElement elem = (CPListElement) fCPathList.getElement(i);
|
||||||
|
elem.appendEncodedSettings(buf);
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChangesInDialog() {
|
||||||
|
String currSettings = getEncodedSettings();
|
||||||
|
return !currSettings.equals(fUserSettingsTimeStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChangesInCPathFile() {
|
||||||
|
IFile file = fCurrCProject.getProject().getFile(".cdtproject"); //$NON-NLS-1$
|
||||||
|
return fFileTimeStamp != file.getModificationStamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeTimeStamps() {
|
||||||
|
IFile file = fCurrCProject.getProject().getFile(".cdtproject"); //$NON-NLS-1$
|
||||||
|
fFileTimeStamp = file.getModificationStamp();
|
||||||
|
fUserSettingsTimeStamp = getEncodedSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List getDefaultCPath(ICProject cproj) {
|
||||||
|
List list = new ArrayList();
|
||||||
|
// IResource srcFolder;
|
||||||
|
// IPreferenceStore store= PreferenceConstants.getPreferenceStore();
|
||||||
|
// String sourceFolderName=
|
||||||
|
// store.getString(PreferenceConstants.SRCBIN_SRCNAME);
|
||||||
|
// if (store.getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ)
|
||||||
|
// && sourceFolderName.length() > 0) {
|
||||||
|
// srcFolder= jproj.getProject().getFolder(sourceFolderName);
|
||||||
|
// } else {
|
||||||
|
// srcFolder= jproj.getProject();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// list.add(new CPListElement(jproj, IClasspathEntry.CPE_SOURCE,
|
||||||
|
// srcFolder.getFullPath(), srcFolder));
|
||||||
|
//
|
||||||
|
// IClasspathEntry[] jreEntries=
|
||||||
|
// PreferenceConstants.getDefaultJRELibrary();
|
||||||
|
// list.addAll(getExistingEntries(jreEntries));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------- public api --------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the Java project. Can return
|
||||||
|
* <code>null<code> if the page has not
|
||||||
|
* been initialized.
|
||||||
|
*/
|
||||||
|
public ICProject getCProject() {
|
||||||
|
return fCurrCProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the current class path (raw). Note that the entries
|
||||||
|
* returned must not be valid.
|
||||||
|
*/
|
||||||
|
public IPathEntry[] getRawCPath() {
|
||||||
|
List elements = fCPathList.getElements();
|
||||||
|
int nElements = elements.size();
|
||||||
|
IPathEntry[] entries = new IPathEntry[elements.size()];
|
||||||
|
|
||||||
|
for (int i = 0; i < nElements; i++) {
|
||||||
|
CPListElement currElement = (CPListElement) elements.get(i);
|
||||||
|
entries[i] = currElement.getPathEntry();
|
||||||
|
}
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------- evaluate default settings --------
|
||||||
|
|
||||||
|
// private List getDefaultClassPath(IJavaProject jproj) {
|
||||||
|
// List list= new ArrayList();
|
||||||
|
// IResource srcFolder;
|
||||||
|
// IPreferenceStore store= PreferenceConstants.getPreferenceStore();
|
||||||
|
// String sourceFolderName=
|
||||||
|
// store.getString(PreferenceConstants.SRCBIN_SRCNAME);
|
||||||
|
// if (store.getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ) &&
|
||||||
|
// sourceFolderName.length() > 0) {
|
||||||
|
// srcFolder= jproj.getProject().getFolder(sourceFolderName);
|
||||||
|
// } else {
|
||||||
|
// srcFolder= jproj.getProject();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// list.add(new CPListElement(jproj, IClasspathEntry.CPE_SOURCE,
|
||||||
|
// srcFolder.getFullPath(), srcFolder));
|
||||||
|
//
|
||||||
|
// IPathEntry[] jreEntries= PreferenceConstants.getDefaultJRELibrary();
|
||||||
|
// list.addAll(getExistingEntries(jreEntries));
|
||||||
|
// return list;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
|
||||||
|
private void doStatusLineUpdate() {
|
||||||
|
IStatus res = findMostSevereStatus();
|
||||||
|
fContext.statusChanged(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IStatus findMostSevereStatus() {
|
||||||
|
return StatusUtil.getMostSevere(new IStatus[] { fCPathStatus, fBuildPathStatus});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the build path.
|
||||||
|
*/
|
||||||
|
public void updateClassPathStatus() {
|
||||||
|
fCPathStatus.setOK();
|
||||||
|
|
||||||
|
List elements = fCPathList.getElements();
|
||||||
|
|
||||||
|
CPListElement entryMissing = null;
|
||||||
|
int nEntriesMissing = 0;
|
||||||
|
IPathEntry[] entries = new IPathEntry[elements.size()];
|
||||||
|
|
||||||
|
for (int i = elements.size() - 1; i >= 0; i--) {
|
||||||
|
CPListElement currElement = (CPListElement) elements.get(i);
|
||||||
|
boolean isChecked = fCPathList.isChecked(currElement);
|
||||||
|
if ( currElement.getEntryKind() == IPathEntry.CDT_SOURCE) {
|
||||||
|
if (isChecked) {
|
||||||
|
fCPathList.setCheckedWithoutUpdate(currElement, false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
currElement.setExported(isChecked);
|
||||||
|
}
|
||||||
|
|
||||||
|
entries[i] = currElement.getPathEntry();
|
||||||
|
if (currElement.isMissing()) {
|
||||||
|
nEntriesMissing++;
|
||||||
|
if (entryMissing == null) {
|
||||||
|
entryMissing = currElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nEntriesMissing > 0) {
|
||||||
|
if (nEntriesMissing == 1) {
|
||||||
|
fCPathStatus.setWarning(CPathEntryMessages.getFormattedString("BuildPathsBlock.warning.EntryMissing", //$NON-NLS-1$
|
||||||
|
entryMissing.getPath().toString()));
|
||||||
|
} else {
|
||||||
|
fCPathStatus.setWarning(CPathEntryMessages.getFormattedString("BuildPathsBlock.warning.EntriesMissing", //$NON-NLS-1$
|
||||||
|
String.valueOf(nEntriesMissing)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if (fCurrJProject.hasClasspathCycle(entries)) {
|
||||||
|
* fClassPathStatus.setWarning(NewWizardMessages.getString("BuildPathsBlock.warning.CycleInClassPath"));
|
||||||
|
* //$NON-NLS-1$ }
|
||||||
|
*/
|
||||||
|
updateBuildPathStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateBuildPathStatus() {
|
||||||
|
List elements = fCPathList.getElements();
|
||||||
|
IPathEntry[] entries = new IPathEntry[elements.size()];
|
||||||
|
|
||||||
|
for (int i = elements.size() - 1; i >= 0; i--) {
|
||||||
|
CPListElement currElement = (CPListElement) elements.get(i);
|
||||||
|
entries[i] = currElement.getPathEntry();
|
||||||
|
}
|
||||||
|
|
||||||
|
ICModelStatus status = CModelStatus.VERIFIED_OK; // CoreModelUtil.validateCPathEntries(fCurrCProject, entries);
|
||||||
|
if (!status.isOK()) {
|
||||||
|
fBuildPathStatus.setError(status.getMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fBuildPathStatus.setOK();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------- creation -------------------------------
|
||||||
|
|
||||||
|
public void configureCProject(IProgressMonitor monitor) throws CoreException, InterruptedException {
|
||||||
|
if (monitor == null) {
|
||||||
|
monitor = new NullProgressMonitor();
|
||||||
|
}
|
||||||
|
monitor.setTaskName(CPathEntryMessages.getString("CPathsBlock.operationdesc_c")); //$NON-NLS-1$
|
||||||
|
monitor.beginTask("", 10); //$NON-NLS-1$
|
||||||
|
|
||||||
|
try {
|
||||||
|
internalConfigureCProject(fCPathList.getElements(), monitor);
|
||||||
|
} finally {
|
||||||
|
monitor.done();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Creates the Java project and sets the configured build path and output
|
||||||
|
* location. If the project already exists only build paths are updated.
|
||||||
|
*/
|
||||||
|
private void internalConfigureCProject(List cPathEntries, IProgressMonitor monitor) throws CoreException, InterruptedException {
|
||||||
|
// 10 monitor steps to go
|
||||||
|
|
||||||
|
monitor.worked(2);
|
||||||
|
|
||||||
|
int nEntries = cPathEntries.size();
|
||||||
|
IPathEntry[] classpath = new IPathEntry[nEntries];
|
||||||
|
|
||||||
|
// create and set the class path
|
||||||
|
for (int i = 0; i < nEntries; i++) {
|
||||||
|
CPListElement entry = ((CPListElement) cPathEntries.get(i));
|
||||||
|
IResource res = entry.getResource();
|
||||||
|
if ((res instanceof IFolder) && !res.exists()) {
|
||||||
|
createFolder((IFolder) res, true, true, null);
|
||||||
|
}
|
||||||
|
classpath[i] = entry.getPathEntry();
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor.worked(1);
|
||||||
|
|
||||||
|
fCurrCProject.setRawPathEntries(classpath, new SubProgressMonitor(monitor, 7));
|
||||||
|
initializeTimeStamps();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a folder and all parent folders if not existing. Project must
|
||||||
|
* exist. <code> org.eclipse.ui.dialogs.ContainerGenerator</code> is too
|
||||||
|
* heavy (creates a runnable)
|
||||||
|
*/
|
||||||
|
private void createFolder(IFolder folder, boolean force, boolean local, IProgressMonitor monitor) throws CoreException {
|
||||||
|
if (!folder.exists()) {
|
||||||
|
IContainer parent = folder.getParent();
|
||||||
|
if (parent instanceof IFolder) {
|
||||||
|
createFolder((IFolder) parent, force, local, null);
|
||||||
|
}
|
||||||
|
folder.create(force, local, monitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------- tab switching ----------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.TabFolderOptionBlock#setCurrentPage(org.eclipse.cdt.ui.dialogs.ICOptionPage)
|
||||||
|
*/
|
||||||
|
public void setCurrentPage(ICOptionPage page) {
|
||||||
|
super.setCurrentPage(page);
|
||||||
|
CPathBasePage newPage = (CPathBasePage) page;
|
||||||
|
if (fCurrPage != null) {
|
||||||
|
List selection = fCurrPage.getSelection();
|
||||||
|
if (!selection.isEmpty()) {
|
||||||
|
newPage.setSelection(selection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#updateContainer()
|
||||||
|
*/
|
||||||
|
public void updateContainer() {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getProject()
|
||||||
|
*/
|
||||||
|
public IProject getProject() {
|
||||||
|
return fCurrCProject.getProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.ui.dialogs.ICOptionContainer#getPreferences()
|
||||||
|
*/
|
||||||
|
public Preferences getPreferences() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,278 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusDialog;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.TypedElementSelectionValidator;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.TypedViewerFilter;
|
||||||
|
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.IListAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IFolder;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ViewerFilter;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
|
||||||
|
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
|
||||||
|
import org.eclipse.ui.model.WorkbenchContentProvider;
|
||||||
|
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
||||||
|
import org.eclipse.ui.views.navigator.ResourceSorter;
|
||||||
|
|
||||||
|
public class ExclusionPatternDialog extends StatusDialog {
|
||||||
|
|
||||||
|
private static class ExclusionPatternLabelProvider extends LabelProvider {
|
||||||
|
|
||||||
|
public Image getImage(Object element) {
|
||||||
|
ImageDescriptorRegistry registry= CUIPlugin.getImageDescriptorRegistry();
|
||||||
|
return registry.get(CPluginImages.DESC_OBJS_EXCLUSION_FILTER_ATTRIB);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getText(Object element) {
|
||||||
|
return (String) element;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private ListDialogField fExclusionPatternList;
|
||||||
|
private CPListElement fCurrElement;
|
||||||
|
private IProject fCurrProject;
|
||||||
|
|
||||||
|
private IContainer fCurrSourceFolder;
|
||||||
|
|
||||||
|
private static final int IDX_ADD= 0;
|
||||||
|
private static final int IDX_ADD_MULTIPLE= 1;
|
||||||
|
private static final int IDX_EDIT= 2;
|
||||||
|
private static final int IDX_REMOVE= 4;
|
||||||
|
|
||||||
|
|
||||||
|
public ExclusionPatternDialog(Shell parent, CPListElement entryToEdit) {
|
||||||
|
super(parent);
|
||||||
|
fCurrElement= entryToEdit;
|
||||||
|
setTitle(CPathEntryMessages.getString("ExclusionPatternDialog.title")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
String label= CPathEntryMessages.getFormattedString("ExclusionPatternDialog.pattern.label", entryToEdit.getPath().makeRelative().toString()); //$NON-NLS-1$
|
||||||
|
|
||||||
|
String[] buttonLabels= new String[] {
|
||||||
|
/* IDX_ADD */ CPathEntryMessages.getString("ExclusionPatternDialog.pattern.add"), //$NON-NLS-1$
|
||||||
|
/* IDX_ADD_MULTIPLE */ CPathEntryMessages.getString("ExclusionPatternDialog.pattern.add.multiple"), //$NON-NLS-1$
|
||||||
|
/* IDX_EDIT */ CPathEntryMessages.getString("ExclusionPatternDialog.pattern.edit"), //$NON-NLS-1$
|
||||||
|
null,
|
||||||
|
/* IDX_REMOVE */ CPathEntryMessages.getString("ExclusionPatternDialog.pattern.remove") //$NON-NLS-1$
|
||||||
|
};
|
||||||
|
|
||||||
|
ExclusionPatternAdapter adapter= new ExclusionPatternAdapter();
|
||||||
|
|
||||||
|
fExclusionPatternList= new ListDialogField(adapter, buttonLabels, new ExclusionPatternLabelProvider());
|
||||||
|
fExclusionPatternList.setDialogFieldListener(adapter);
|
||||||
|
fExclusionPatternList.setLabelText(label);
|
||||||
|
fExclusionPatternList.setRemoveButtonIndex(IDX_REMOVE);
|
||||||
|
fExclusionPatternList.enableButton(IDX_EDIT, false);
|
||||||
|
|
||||||
|
fCurrProject= entryToEdit.getCProject().getProject();
|
||||||
|
IWorkspaceRoot root= fCurrProject.getWorkspace().getRoot();
|
||||||
|
IResource res= root.findMember(entryToEdit.getPath());
|
||||||
|
if (res instanceof IContainer) {
|
||||||
|
fCurrSourceFolder= (IContainer) res;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPath[] pattern= (IPath[]) entryToEdit.getAttribute(CPListElement.EXCLUSION);
|
||||||
|
|
||||||
|
ArrayList elements= new ArrayList(pattern.length);
|
||||||
|
for (int i= 0; i < pattern.length; i++) {
|
||||||
|
elements.add(pattern[i].toString());
|
||||||
|
}
|
||||||
|
fExclusionPatternList.setElements(elements);
|
||||||
|
fExclusionPatternList.selectFirstElement();
|
||||||
|
fExclusionPatternList.enableButton(IDX_ADD_MULTIPLE, fCurrSourceFolder != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected Control createDialogArea(Composite parent) {
|
||||||
|
Composite composite= (Composite)super.createDialogArea(parent);
|
||||||
|
|
||||||
|
Composite inner= new Composite(composite, SWT.NONE);
|
||||||
|
GridLayout layout= new GridLayout();
|
||||||
|
layout.marginHeight= 0;
|
||||||
|
layout.marginWidth= 0;
|
||||||
|
layout.numColumns= 2;
|
||||||
|
inner.setLayout(layout);
|
||||||
|
|
||||||
|
fExclusionPatternList.doFillIntoGrid(inner, 3);
|
||||||
|
LayoutUtil.setHorizontalSpan(fExclusionPatternList.getLabelControl(null), 2);
|
||||||
|
|
||||||
|
applyDialogFont(composite);
|
||||||
|
return composite;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doCustomButtonPressed(ListDialogField field, int index) {
|
||||||
|
if (index == IDX_ADD) {
|
||||||
|
addEntry();
|
||||||
|
} else if (index == IDX_EDIT) {
|
||||||
|
editEntry();
|
||||||
|
} else if (index == IDX_ADD_MULTIPLE) {
|
||||||
|
addMultipleEntries();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doDoubleClicked(ListDialogField field) {
|
||||||
|
editEntry();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doSelectionChanged(ListDialogField field) {
|
||||||
|
List selected= field.getSelectedElements();
|
||||||
|
fExclusionPatternList.enableButton(IDX_EDIT, canEdit(selected));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canEdit(List selected) {
|
||||||
|
return selected.size() == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editEntry() {
|
||||||
|
|
||||||
|
List selElements= fExclusionPatternList.getSelectedElements();
|
||||||
|
if (selElements.size() != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List existing= fExclusionPatternList.getElements();
|
||||||
|
String entry= (String) selElements.get(0);
|
||||||
|
ExclusionPatternEntryDialog dialog= new ExclusionPatternEntryDialog(getShell(), entry, existing, fCurrElement);
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
fExclusionPatternList.replaceElement(entry, dialog.getExclusionPattern());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addEntry() {
|
||||||
|
List existing= fExclusionPatternList.getElements();
|
||||||
|
ExclusionPatternEntryDialog dialog= new ExclusionPatternEntryDialog(getShell(), null, existing, fCurrElement);
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
fExclusionPatternList.addElement(dialog.getExclusionPattern());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------- ExclusionPatternAdapter --------
|
||||||
|
|
||||||
|
private class ExclusionPatternAdapter implements IListAdapter, IDialogFieldListener {
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#customButtonPressed(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField, int)
|
||||||
|
*/
|
||||||
|
public void customButtonPressed(ListDialogField field, int index) {
|
||||||
|
doCustomButtonPressed(field, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#selectionChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
|
||||||
|
*/
|
||||||
|
public void selectionChanged(ListDialogField field) {
|
||||||
|
doSelectionChanged(field);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#doubleClicked(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
|
||||||
|
*/
|
||||||
|
public void doubleClicked(ListDialogField field) {
|
||||||
|
doDoubleClicked(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener#dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField)
|
||||||
|
*/
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doStatusLineUpdate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkIfPatternValid() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public IPath[] getExclusionPattern() {
|
||||||
|
IPath[] res= new IPath[fExclusionPatternList.getSize()];
|
||||||
|
for (int i= 0; i < res.length; i++) {
|
||||||
|
String entry= (String) fExclusionPatternList.getElement(i);
|
||||||
|
res[i]= new Path(entry);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.jface.window.Window#configureShell(Shell)
|
||||||
|
*/
|
||||||
|
protected void configureShell(Shell newShell) {
|
||||||
|
super.configureShell(newShell);
|
||||||
|
// WorkbenchHelp.setHelp(newShell, ICHelpContextIds.EXCLUSION_PATTERN_DIALOG);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMultipleEntries() {
|
||||||
|
Class[] acceptedClasses= new Class[] { IFolder.class, IFile.class };
|
||||||
|
ISelectionStatusValidator validator= new TypedElementSelectionValidator(acceptedClasses, true);
|
||||||
|
ViewerFilter filter= new TypedViewerFilter(acceptedClasses);
|
||||||
|
|
||||||
|
ILabelProvider lp= new WorkbenchLabelProvider();
|
||||||
|
ITreeContentProvider cp= new WorkbenchContentProvider();
|
||||||
|
|
||||||
|
IResource initialElement= null;
|
||||||
|
|
||||||
|
ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), lp, cp);
|
||||||
|
dialog.setTitle(CPathEntryMessages.getString("ExclusionPatternDialog.ChooseExclusionPattern.title")); //$NON-NLS-1$
|
||||||
|
dialog.setValidator(validator);
|
||||||
|
dialog.setMessage(CPathEntryMessages.getString("ExclusionPatternDialog.ChooseExclusionPattern.description")); //$NON-NLS-1$
|
||||||
|
dialog.addFilter(filter);
|
||||||
|
dialog.setInput(fCurrSourceFolder);
|
||||||
|
dialog.setInitialSelection(initialElement);
|
||||||
|
dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
|
||||||
|
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
Object[] objects= dialog.getResult();
|
||||||
|
int existingSegments= fCurrSourceFolder.getFullPath().segmentCount();
|
||||||
|
|
||||||
|
for (int i= 0; i < objects.length; i++) {
|
||||||
|
IResource curr= (IResource) objects[i];
|
||||||
|
IPath path= curr.getFullPath().removeFirstSegments(existingSegments).makeRelative();
|
||||||
|
String res;
|
||||||
|
if (curr instanceof IContainer) {
|
||||||
|
res= path.addTrailingSeparator().toString();
|
||||||
|
} else {
|
||||||
|
res= path.toString();
|
||||||
|
}
|
||||||
|
fExclusionPatternList.addElement(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,229 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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: IBM Corporation - initial API and implementation
|
||||||
|
******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusDialog;
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.TypedElementSelectionValidator;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.TypedViewerFilter;
|
||||||
|
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.StringButtonDialogField;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
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.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
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.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
|
||||||
|
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
|
||||||
|
import org.eclipse.ui.model.WorkbenchContentProvider;
|
||||||
|
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
||||||
|
import org.eclipse.ui.views.navigator.ResourceSorter;
|
||||||
|
|
||||||
|
public class ExclusionPatternEntryDialog extends StatusDialog {
|
||||||
|
|
||||||
|
private StringButtonDialogField fExclusionPatternDialog;
|
||||||
|
private StatusInfo fExclusionPatternStatus;
|
||||||
|
|
||||||
|
private IContainer fCurrSourceFolder;
|
||||||
|
private String fExclusionPattern;
|
||||||
|
private List fExistingPatterns;
|
||||||
|
|
||||||
|
public ExclusionPatternEntryDialog(Shell parent, String patternToEdit, List existingPatterns, CPListElement entryToEdit) {
|
||||||
|
super(parent);
|
||||||
|
fExistingPatterns = existingPatterns;
|
||||||
|
if (patternToEdit == null) {
|
||||||
|
setTitle(CPathEntryMessages.getString("ExclusionPatternEntryDialog.add.title")); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
setTitle(CPathEntryMessages.getString("ExclusionPatternEntryDialog.edit.title")); //$NON-NLS-1$
|
||||||
|
fExistingPatterns.remove(patternToEdit);
|
||||||
|
}
|
||||||
|
|
||||||
|
IWorkspaceRoot root = entryToEdit.getCProject().getProject().getWorkspace().getRoot();
|
||||||
|
IResource res = root.findMember(entryToEdit.getPath());
|
||||||
|
if (res instanceof IContainer) {
|
||||||
|
fCurrSourceFolder = (IContainer) res;
|
||||||
|
}
|
||||||
|
|
||||||
|
fExclusionPatternStatus = new StatusInfo();
|
||||||
|
|
||||||
|
String label = CPathEntryMessages.getFormattedString("ExclusionPatternEntryDialog.pattern.label", //$NON-NLS-1$
|
||||||
|
entryToEdit.getPath().makeRelative().toString());
|
||||||
|
|
||||||
|
ExclusionPatternAdapter adapter = new ExclusionPatternAdapter();
|
||||||
|
fExclusionPatternDialog = new StringButtonDialogField(adapter);
|
||||||
|
fExclusionPatternDialog.setLabelText(label);
|
||||||
|
fExclusionPatternDialog.setButtonLabel(CPathEntryMessages.getString("ExclusionPatternEntryDialog.pattern.button")); //$NON-NLS-1$
|
||||||
|
fExclusionPatternDialog.setDialogFieldListener(adapter);
|
||||||
|
fExclusionPatternDialog.enableButton(fCurrSourceFolder != null);
|
||||||
|
|
||||||
|
if (patternToEdit == null) {
|
||||||
|
fExclusionPatternDialog.setText(""); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
fExclusionPatternDialog.setText(patternToEdit.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Control createDialogArea(Composite parent) {
|
||||||
|
Composite composite = (Composite) super.createDialogArea(parent);
|
||||||
|
|
||||||
|
int widthHint = convertWidthInCharsToPixels(60);
|
||||||
|
|
||||||
|
Composite inner = new Composite(composite, SWT.NONE);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.numColumns = 2;
|
||||||
|
inner.setLayout(layout);
|
||||||
|
|
||||||
|
Label description = new Label(inner, SWT.WRAP);
|
||||||
|
description.setText(CPathEntryMessages.getString("ExclusionPatternEntryDialog.description")); //$NON-NLS-1$
|
||||||
|
GridData gd = new GridData();
|
||||||
|
gd.horizontalSpan = 2;
|
||||||
|
gd.widthHint = convertWidthInCharsToPixels(80);
|
||||||
|
description.setLayoutData(gd);
|
||||||
|
|
||||||
|
fExclusionPatternDialog.doFillIntoGrid(inner, 3);
|
||||||
|
|
||||||
|
LayoutUtil.setWidthHint(fExclusionPatternDialog.getLabelControl(null), widthHint);
|
||||||
|
LayoutUtil.setHorizontalSpan(fExclusionPatternDialog.getLabelControl(null), 2);
|
||||||
|
|
||||||
|
LayoutUtil.setWidthHint(fExclusionPatternDialog.getTextControl(null), widthHint);
|
||||||
|
LayoutUtil.setHorizontalGrabbing(fExclusionPatternDialog.getTextControl(null));
|
||||||
|
|
||||||
|
fExclusionPatternDialog.postSetFocusOnDialogField(parent.getDisplay());
|
||||||
|
applyDialogFont(composite);
|
||||||
|
return composite;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------- ExclusionPatternAdapter --------
|
||||||
|
|
||||||
|
private class ExclusionPatternAdapter implements IDialogFieldListener, IStringButtonAdapter {
|
||||||
|
|
||||||
|
// -------- IDialogFieldListener
|
||||||
|
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
doStatusLineUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeControlPressed(DialogField field) {
|
||||||
|
doChangeControlPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doChangeControlPressed() {
|
||||||
|
IPath pattern = chooseExclusionPattern();
|
||||||
|
if (pattern != null) {
|
||||||
|
fExclusionPatternDialog.setText(pattern.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doStatusLineUpdate() {
|
||||||
|
checkIfPatternValid();
|
||||||
|
updateStatus(fExclusionPatternStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkIfPatternValid() {
|
||||||
|
String pattern = fExclusionPatternDialog.getText().trim();
|
||||||
|
if (pattern.length() == 0) {
|
||||||
|
fExclusionPatternStatus.setError(CPathEntryMessages.getString("ExclusionPatternEntryDialog.error.empty")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IPath path = new Path(pattern);
|
||||||
|
if (path.isAbsolute() || path.getDevice() != null) {
|
||||||
|
fExclusionPatternStatus.setError(CPathEntryMessages.getString("ExclusionPatternEntryDialog.error.notrelative")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (fExistingPatterns.contains(pattern)) {
|
||||||
|
fExclusionPatternStatus.setError(CPathEntryMessages.getString("ExclusionPatternEntryDialog.error.exists")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fExclusionPattern = pattern;
|
||||||
|
fExclusionPatternStatus.setOK();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExclusionPattern() {
|
||||||
|
return fExclusionPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.jface.window.Window#configureShell(Shell)
|
||||||
|
*/
|
||||||
|
protected void configureShell(Shell newShell) {
|
||||||
|
super.configureShell(newShell);
|
||||||
|
// WorkbenchHelp.setHelp(newShell,
|
||||||
|
// ICHelpContextIds.EXCLUSION_PATTERN_DIALOG);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- util method ------------
|
||||||
|
|
||||||
|
private IPath chooseExclusionPattern() {
|
||||||
|
Class[] acceptedClasses = new Class[] { IFolder.class, IFile.class};
|
||||||
|
ISelectionStatusValidator validator = new TypedElementSelectionValidator(acceptedClasses, false);
|
||||||
|
ViewerFilter filter = new TypedViewerFilter(acceptedClasses);
|
||||||
|
|
||||||
|
ILabelProvider lp = new WorkbenchLabelProvider();
|
||||||
|
ITreeContentProvider cp = new WorkbenchContentProvider();
|
||||||
|
|
||||||
|
IPath initialPath = new Path(fExclusionPatternDialog.getText());
|
||||||
|
IResource initialElement = null;
|
||||||
|
IContainer curr = fCurrSourceFolder;
|
||||||
|
int nSegments = initialPath.segmentCount();
|
||||||
|
for (int i = 0; i < nSegments; i++) {
|
||||||
|
IResource elem = curr.findMember(initialPath.segment(i));
|
||||||
|
if (elem != null) {
|
||||||
|
initialElement = elem;
|
||||||
|
}
|
||||||
|
if (elem instanceof IContainer) {
|
||||||
|
curr = (IContainer) elem;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), lp, cp);
|
||||||
|
dialog.setTitle(CPathEntryMessages.getString("ExclusionPatternEntryDialog.ChooseExclusionPattern.title")); //$NON-NLS-1$
|
||||||
|
dialog.setValidator(validator);
|
||||||
|
dialog.setMessage(CPathEntryMessages.getString("ExclusionPatternEntryDialog.ChooseExclusionPattern.description")); //$NON-NLS-1$
|
||||||
|
dialog.addFilter(filter);
|
||||||
|
dialog.setInput(fCurrSourceFolder);
|
||||||
|
dialog.setInitialSelection(initialElement);
|
||||||
|
dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
|
||||||
|
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
IResource res = (IResource) dialog.getFirstResult();
|
||||||
|
IPath path = res.getFullPath().removeFirstSegments(fCurrSourceFolder.getFullPath().segmentCount()).makeRelative();
|
||||||
|
if (res instanceof IContainer) {
|
||||||
|
return path.addTrailingSeparator();
|
||||||
|
} else {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,315 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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: IBM Corporation - initial API and implementation
|
||||||
|
******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.NewWizardMessages;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
|
import org.eclipse.jface.viewers.CheckStateChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.CheckboxTreeViewer;
|
||||||
|
import org.eclipse.jface.viewers.ICheckStateListener;
|
||||||
|
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.ViewerFilter;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.custom.BusyIndicator;
|
||||||
|
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.swt.widgets.Tree;
|
||||||
|
import org.eclipse.ui.dialogs.NewFolderDialog;
|
||||||
|
import org.eclipse.ui.dialogs.SelectionStatusDialog;
|
||||||
|
import org.eclipse.ui.views.navigator.ResourceSorter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class MultipleFolderSelectionDialog extends SelectionStatusDialog implements ISelectionChangedListener {
|
||||||
|
|
||||||
|
private CheckboxTreeViewer fViewer;
|
||||||
|
|
||||||
|
private ILabelProvider fLabelProvider;
|
||||||
|
private ITreeContentProvider fContentProvider;
|
||||||
|
private List fFilters;
|
||||||
|
|
||||||
|
private Object fInput;
|
||||||
|
private Button fNewFolderButton;
|
||||||
|
private IContainer fSelectedContainer;
|
||||||
|
private Set fExisting;
|
||||||
|
private Object fFocusElement;
|
||||||
|
|
||||||
|
public MultipleFolderSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
|
||||||
|
super(parent);
|
||||||
|
fLabelProvider = labelProvider;
|
||||||
|
fContentProvider = contentProvider;
|
||||||
|
|
||||||
|
setSelectionResult(null);
|
||||||
|
setStatusLineAboveButtons(true);
|
||||||
|
|
||||||
|
int shellStyle = getShellStyle();
|
||||||
|
setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);
|
||||||
|
|
||||||
|
fExisting = null;
|
||||||
|
fFocusElement = null;
|
||||||
|
fFilters = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExisting(Object[] existing) {
|
||||||
|
fExisting = new HashSet();
|
||||||
|
for (int i = 0; i < existing.length; i++) {
|
||||||
|
fExisting.add(existing[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the tree input.
|
||||||
|
*
|
||||||
|
* @param input
|
||||||
|
* the tree input.
|
||||||
|
*/
|
||||||
|
public void setInput(Object input) {
|
||||||
|
fInput = input;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a filter to the tree viewer.
|
||||||
|
*
|
||||||
|
* @param filter
|
||||||
|
* a filter.
|
||||||
|
*/
|
||||||
|
public void addFilter(ViewerFilter filter) {
|
||||||
|
if (fFilters == null)
|
||||||
|
fFilters = new ArrayList(4);
|
||||||
|
|
||||||
|
fFilters.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles cancel button pressed event.
|
||||||
|
*/
|
||||||
|
protected void cancelPressed() {
|
||||||
|
setSelectionResult(null);
|
||||||
|
super.cancelPressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see SelectionStatusDialog#computeResult()
|
||||||
|
*/
|
||||||
|
protected void computeResult() {
|
||||||
|
Object[] checked = fViewer.getCheckedElements();
|
||||||
|
if (fExisting == null) {
|
||||||
|
if (checked.length == 0) {
|
||||||
|
checked = null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ArrayList res = new ArrayList();
|
||||||
|
for (int i = 0; i < checked.length; i++) {
|
||||||
|
Object elem = checked[i];
|
||||||
|
if (!fExisting.contains(elem)) {
|
||||||
|
res.add(elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!res.isEmpty()) {
|
||||||
|
checked = res.toArray();
|
||||||
|
} else {
|
||||||
|
checked = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setSelectionResult(checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void access$superCreate() {
|
||||||
|
super.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see Window#create()
|
||||||
|
*/
|
||||||
|
public void create() {
|
||||||
|
|
||||||
|
BusyIndicator.showWhile(null, new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
access$superCreate();
|
||||||
|
|
||||||
|
fViewer.setCheckedElements(getInitialElementSelections().toArray());
|
||||||
|
|
||||||
|
fViewer.expandToLevel(2);
|
||||||
|
if (fExisting != null) {
|
||||||
|
for (Iterator iter = fExisting.iterator(); iter.hasNext();) {
|
||||||
|
fViewer.reveal(iter.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateOKStatus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the tree viewer.
|
||||||
|
*
|
||||||
|
* @param parent
|
||||||
|
* the parent composite
|
||||||
|
* @return the tree viewer
|
||||||
|
*/
|
||||||
|
protected CheckboxTreeViewer createTreeViewer(Composite parent) {
|
||||||
|
fViewer = new CheckboxTreeViewer(parent, SWT.BORDER);
|
||||||
|
|
||||||
|
fViewer.setContentProvider(fContentProvider);
|
||||||
|
fViewer.setLabelProvider(fLabelProvider);
|
||||||
|
fViewer.addCheckStateListener(new ICheckStateListener() {
|
||||||
|
|
||||||
|
public void checkStateChanged(CheckStateChangedEvent event) {
|
||||||
|
updateOKStatus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
fViewer.setSorter(new ResourceSorter(ResourceSorter.NAME));
|
||||||
|
if (fFilters != null) {
|
||||||
|
for (int i = 0; i != fFilters.size(); i++)
|
||||||
|
fViewer.addFilter((ViewerFilter) fFilters.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
fViewer.setInput(fInput);
|
||||||
|
|
||||||
|
return fViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected void updateOKStatus() {
|
||||||
|
computeResult();
|
||||||
|
if (getResult() != null) {
|
||||||
|
updateStatus(new StatusInfo());
|
||||||
|
} else {
|
||||||
|
updateStatus(new StatusInfo(IStatus.ERROR, "")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (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);
|
||||||
|
|
||||||
|
createMessageArea(composite);
|
||||||
|
CheckboxTreeViewer treeViewer = createTreeViewer(composite);
|
||||||
|
|
||||||
|
GridData data = new GridData(GridData.FILL_BOTH);
|
||||||
|
data.widthHint = convertWidthInCharsToPixels(60);
|
||||||
|
data.heightHint = convertHeightInCharsToPixels(18);
|
||||||
|
|
||||||
|
Tree treeWidget = treeViewer.getTree();
|
||||||
|
treeWidget.setLayoutData(data);
|
||||||
|
treeWidget.setFont(composite.getFont());
|
||||||
|
|
||||||
|
Button button = new Button(composite, SWT.PUSH);
|
||||||
|
button.setText(NewWizardMessages.getString("MultipleFolderSelectionDialog.button")); //$NON-NLS-1$
|
||||||
|
button.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
newFolderButtonPressed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
button.setFont(composite.getFont());
|
||||||
|
|
||||||
|
data = new GridData();
|
||||||
|
data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
|
||||||
|
button.setLayoutData(data);
|
||||||
|
fNewFolderButton = button;
|
||||||
|
|
||||||
|
treeViewer.addSelectionChangedListener(this);
|
||||||
|
if (fExisting != null) {
|
||||||
|
Object[] existing = fExisting.toArray();
|
||||||
|
treeViewer.setGrayedElements(existing);
|
||||||
|
setInitialSelections(existing);
|
||||||
|
}
|
||||||
|
if (fFocusElement != null) {
|
||||||
|
treeViewer.setSelection(new StructuredSelection(fFocusElement), true);
|
||||||
|
}
|
||||||
|
treeViewer.addCheckStateListener(new ICheckStateListener() {
|
||||||
|
|
||||||
|
public void checkStateChanged(CheckStateChangedEvent event) {
|
||||||
|
forceExistingChecked(event);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
applyDialogFont(composite);
|
||||||
|
return composite;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void forceExistingChecked(CheckStateChangedEvent event) {
|
||||||
|
if (fExisting != null) {
|
||||||
|
Object elem = event.getElement();
|
||||||
|
if (fExisting.contains(elem)) {
|
||||||
|
fViewer.setChecked(elem, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateNewFolderButtonState() {
|
||||||
|
IStructuredSelection selection = (IStructuredSelection) fViewer.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) {
|
||||||
|
CheckboxTreeViewer treeViewer = fViewer;
|
||||||
|
treeViewer.refresh(fSelectedContainer);
|
||||||
|
Object createdFolder = dialog.getResult()[0];
|
||||||
|
treeViewer.reveal(createdFolder);
|
||||||
|
treeViewer.setChecked(createdFolder, true);
|
||||||
|
treeViewer.setSelection(new StructuredSelection(createdFolder));
|
||||||
|
updateOKStatus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
|
||||||
|
*/
|
||||||
|
public void selectionChanged(SelectionChangedEvent event) {
|
||||||
|
updateNewFolderButtonState();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInitialFocus(Object focusElement) {
|
||||||
|
fFocusElement = focusElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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: IBM Corporation - initial API and implementation
|
||||||
|
******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.dialogs.cpaths;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusDialog;
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.NewWizardMessages;
|
||||||
|
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.SelectionButtonDialogField;
|
||||||
|
import org.eclipse.cdt.internal.ui.wizards.dialogfields.StringDialogField;
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
|
||||||
|
public class NewSourceFolderDialog extends StatusDialog {
|
||||||
|
|
||||||
|
private SelectionButtonDialogField fUseProjectButton;
|
||||||
|
private SelectionButtonDialogField fUseFolderButton;
|
||||||
|
|
||||||
|
private StringDialogField fContainerDialogField;
|
||||||
|
private StatusInfo fContainerFieldStatus;
|
||||||
|
|
||||||
|
private IContainer fFolder;
|
||||||
|
private List fExistingFolders;
|
||||||
|
private IProject fCurrProject;
|
||||||
|
|
||||||
|
public NewSourceFolderDialog(Shell parent, String title, IProject project, List existingFolders, CPListElement entryToEdit) {
|
||||||
|
super(parent);
|
||||||
|
setTitle(title);
|
||||||
|
|
||||||
|
fContainerFieldStatus = new StatusInfo();
|
||||||
|
|
||||||
|
SourceContainerAdapter adapter = new SourceContainerAdapter();
|
||||||
|
|
||||||
|
fUseProjectButton = new SelectionButtonDialogField(SWT.RADIO);
|
||||||
|
fUseProjectButton.setLabelText(NewWizardMessages.getString("NewSourceFolderDialog.useproject.button")); //$NON-NLS-1$
|
||||||
|
fUseProjectButton.setDialogFieldListener(adapter);
|
||||||
|
|
||||||
|
fUseFolderButton = new SelectionButtonDialogField(SWT.RADIO);
|
||||||
|
fUseFolderButton.setLabelText(NewWizardMessages.getString("NewSourceFolderDialog.usefolder.button")); //$NON-NLS-1$
|
||||||
|
fUseFolderButton.setDialogFieldListener(adapter);
|
||||||
|
|
||||||
|
fContainerDialogField = new StringDialogField();
|
||||||
|
fContainerDialogField.setDialogFieldListener(adapter);
|
||||||
|
fContainerDialogField.setLabelText(NewWizardMessages.getString("NewSourceFolderDialog.sourcefolder.label")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fUseFolderButton.attachDialogField(fContainerDialogField);
|
||||||
|
|
||||||
|
fFolder = null;
|
||||||
|
fExistingFolders = existingFolders;
|
||||||
|
fCurrProject = project;
|
||||||
|
|
||||||
|
boolean useFolders = true;
|
||||||
|
if (entryToEdit == null) {
|
||||||
|
fContainerDialogField.setText(""); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
IPath editPath = entryToEdit.getPath().removeFirstSegments(1);
|
||||||
|
fContainerDialogField.setText(editPath.toString());
|
||||||
|
useFolders = !editPath.isEmpty();
|
||||||
|
}
|
||||||
|
fUseFolderButton.setSelection(useFolders);
|
||||||
|
fUseProjectButton.setSelection(!useFolders);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String message) {
|
||||||
|
fContainerDialogField.setLabelText(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Control createDialogArea(Composite parent) {
|
||||||
|
Composite composite = (Composite) super.createDialogArea(parent);
|
||||||
|
|
||||||
|
Composite inner = new Composite(composite, SWT.NONE);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.numColumns = 1;
|
||||||
|
inner.setLayout(layout);
|
||||||
|
|
||||||
|
int widthHint = convertWidthInCharsToPixels(50);
|
||||||
|
|
||||||
|
GridData data = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
data.widthHint = widthHint;
|
||||||
|
|
||||||
|
if (fExistingFolders.contains(fCurrProject)) {
|
||||||
|
fContainerDialogField.doFillIntoGrid(inner, 2);
|
||||||
|
} else {
|
||||||
|
fUseProjectButton.doFillIntoGrid(inner, 1);
|
||||||
|
fUseFolderButton.doFillIntoGrid(inner, 1);
|
||||||
|
fContainerDialogField.getTextControl(inner);
|
||||||
|
|
||||||
|
int horizontalIndent = convertWidthInCharsToPixels(3);
|
||||||
|
data.horizontalIndent = horizontalIndent;
|
||||||
|
}
|
||||||
|
Control control = fContainerDialogField.getTextControl(null);
|
||||||
|
control.setLayoutData(data);
|
||||||
|
|
||||||
|
fContainerDialogField.postSetFocusOnDialogField(parent.getDisplay());
|
||||||
|
applyDialogFont(composite);
|
||||||
|
return composite;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------- SourceContainerAdapter --------
|
||||||
|
|
||||||
|
private class SourceContainerAdapter implements IDialogFieldListener {
|
||||||
|
|
||||||
|
// -------- IDialogFieldListener
|
||||||
|
|
||||||
|
public void dialogFieldChanged(DialogField field) {
|
||||||
|
doStatusLineUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doStatusLineUpdate() {
|
||||||
|
checkIfPathValid();
|
||||||
|
updateStatus(fContainerFieldStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkIfPathValid() {
|
||||||
|
fFolder = null;
|
||||||
|
IContainer folder = null;
|
||||||
|
if (fUseFolderButton.isSelected()) {
|
||||||
|
String pathStr = fContainerDialogField.getText();
|
||||||
|
if (pathStr.length() == 0) {
|
||||||
|
fContainerFieldStatus.setError(NewWizardMessages.getString("NewSourceFolderDialog.error.enterpath")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IPath path = fCurrProject.getFullPath().append(pathStr);
|
||||||
|
IWorkspace workspace = fCurrProject.getWorkspace();
|
||||||
|
|
||||||
|
IStatus pathValidation = workspace.validatePath(path.toString(), IResource.FOLDER);
|
||||||
|
if (!pathValidation.isOK()) {
|
||||||
|
fContainerFieldStatus.setError(NewWizardMessages.getFormattedString("NewSourceFolderDialog.error.invalidpath", //$NON-NLS-1$
|
||||||
|
pathValidation.getMessage()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
folder = fCurrProject.getFolder(pathStr);
|
||||||
|
} else {
|
||||||
|
folder = fCurrProject;
|
||||||
|
}
|
||||||
|
if (isExisting(folder)) {
|
||||||
|
fContainerFieldStatus.setError(NewWizardMessages.getString("NewSourceFolderDialog.error.pathexists")); //$NON-NLS-1$
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fContainerFieldStatus.setOK();
|
||||||
|
fFolder = folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isExisting(IContainer folder) {
|
||||||
|
return fExistingFolders.contains(folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IContainer getSourceFolder() {
|
||||||
|
return fFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.jface.window.Window#configureShell(Shell)
|
||||||
|
*/
|
||||||
|
protected void configureShell(Shell newShell) {
|
||||||
|
super.configureShell(newShell);
|
||||||
|
// WorkbenchHelp.setHelp(newShell,
|
||||||
|
// ICHelpContextIds.NEW_CONTAINER_DIALOG);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -120,7 +120,7 @@ CEditorPreferencePage.behaviorPage.printMarginColor=Print margin color
|
||||||
CEditorPreferencePage.behaviorPage.linkedPositionColor=Linked position color
|
CEditorPreferencePage.behaviorPage.linkedPositionColor=Linked position color
|
||||||
CEditorPreferencePage.behaviorPage.Color=Color:
|
CEditorPreferencePage.behaviorPage.Color=Color:
|
||||||
CEditorPreferencePage.textFont.changeButton=C&hange...
|
CEditorPreferencePage.textFont.changeButton=C&hange...
|
||||||
TemplatePreferencePage.Viewer.preview=Preview:
|
|
||||||
BuildConsolePreferencePage.fieldEditors.buildConsoleLines=&Build console lines:
|
|
||||||
CEditorPreferencePage.Navigation=Navigation
|
CEditorPreferencePage.Navigation=Navigation
|
||||||
CEditorPreferencePage.Enable_Hyperlink_Navigation=Enable Hyperlink Navigation
|
CEditorPreferencePage.Enable_Hyperlink_Navigation=Enable Hyperlink Navigation
|
||||||
|
|
||||||
|
TemplatePreferencePage.Viewer.preview=Preview:
|
||||||
|
|
|
@ -273,129 +273,6 @@ NewSnippetFileWizardPage.error.OnlyInJavaProject=The scrapbook page can only be
|
||||||
|
|
||||||
NewSnippetFileWizardPage.open_error.message=Error in NewScrapbookPage
|
NewSnippetFileWizardPage.open_error.message=Error in NewScrapbookPage
|
||||||
|
|
||||||
# ------- BuildPathsBlock -------
|
|
||||||
|
|
||||||
BuildPathsBlock.tab.source=&Source
|
|
||||||
BuildPathsBlock.tab.projects=&Projects
|
|
||||||
BuildPathsBlock.tab.libraries=&Libraries
|
|
||||||
BuildPathsBlock.tab.order=&Order and Export
|
|
||||||
|
|
||||||
BuildPathsBlock.classpath.label=Build &class path order and exported entries:\n(Exported entries are contributed to dependent projects)
|
|
||||||
|
|
||||||
BuildPathsBlock.classpath.up.button=&Up
|
|
||||||
BuildPathsBlock.classpath.down.button=&Down
|
|
||||||
BuildPathsBlock.classpath.checkall.button=Select &All
|
|
||||||
BuildPathsBlock.classpath.uncheckall.button=D&eselect All
|
|
||||||
|
|
||||||
BuildPathsBlock.buildpath.label=Defaul&t output folder:
|
|
||||||
BuildPathsBlock.buildpath.button=Bro&wse...
|
|
||||||
|
|
||||||
BuildPathsBlock.error.InvalidBuildPath=Invalid build output folder: ''{0}''
|
|
||||||
BuildPathsBlock.error.EnterBuildPath=Build output folder must be entered.
|
|
||||||
|
|
||||||
BuildPathsBlock.warning.EntryMissing=Build path entry is missing: {0}
|
|
||||||
BuildPathsBlock.warning.EntriesMissing={0} build path entries are missing.
|
|
||||||
|
|
||||||
BuildPathsBlock.operationdesc_project=Creating project...
|
|
||||||
BuildPathsBlock.operationdesc_java=Setting build paths...
|
|
||||||
|
|
||||||
BuildPathsBlock.ChooseOutputFolderDialog.title=Folder Selection
|
|
||||||
BuildPathsBlock.ChooseOutputFolderDialog.description=&Choose the folder for the build output:
|
|
||||||
|
|
||||||
BuildPathsBlock.RemoveBinariesDialog.title=Setting Build Paths
|
|
||||||
BuildPathsBlock.RemoveBinariesDialog.description=The output folder has changed. OK to remove all generated resources from the old location ''{0}''?
|
|
||||||
|
|
||||||
# ------- CPListLabelProvider -------
|
|
||||||
|
|
||||||
CPListLabelProvider.new=(new)
|
|
||||||
CPListLabelProvider.classcontainer=(class folder)
|
|
||||||
CPListLabelProvider.twopart={0} - {1}
|
|
||||||
CPListLabelProvider.willbecreated=(will be created)
|
|
||||||
|
|
||||||
|
|
||||||
# ------- SourceContainerWorkbookPage-------
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.folders.label=Source folders on build pat&h:
|
|
||||||
SourceContainerWorkbookPage.folders.remove.button=&Remove
|
|
||||||
SourceContainerWorkbookPage.folders.add.button=&Add Folder...
|
|
||||||
SourceContainerWorkbookPage.folders.edit.button=&Edit...
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.folders.check=Allow output folders for sour&ce folders.
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.ExistingSourceFolderDialog.new.title=Source Folder Selection
|
|
||||||
SourceContainerWorkbookPage.ExistingSourceFolderDialog.new.description=&Choose source folders to be added to the build path:
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.ExistingSourceFolderDialog.edit.title=Source Folder Selection
|
|
||||||
SourceContainerWorkbookPage.ExistingSourceFolderDialog.edit.description=&Select the source folder:
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.NewSourceFolderDialog.new.title=New Source Folder
|
|
||||||
SourceContainerWorkbookPage.NewSourceFolderDialog.edit.title=Edit Source Folder
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.NewSourceFolderDialog.description=&Enter a path relative to ''{0}'':
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.ChangeOutputLocationDialog.title=Source Folder Added
|
|
||||||
SourceContainerWorkbookPage.ChangeOutputLocationDialog.project_and_output.message=Do you want to remove the project as source folder and update build output folder to ''{0}''?
|
|
||||||
SourceContainerWorkbookPage.ChangeOutputLocationDialog.project.message=Do you want to remove the project as source folder?
|
|
||||||
|
|
||||||
SourceContainerWorkbookPage.exclusion_added.title=Source Folder Added
|
|
||||||
SourceContainerWorkbookPage.exclusion_added.message=Exclusion filters have been added to nesting folders.
|
|
||||||
|
|
||||||
# ------- ProjectsWorkbookPage-------
|
|
||||||
|
|
||||||
ProjectsWorkbookPage.projects.label=&Required projects on the build path:
|
|
||||||
ProjectsWorkbookPage.projects.checkall.button=Select &All
|
|
||||||
ProjectsWorkbookPage.projects.uncheckall.button=&Deselect All
|
|
||||||
|
|
||||||
# ------- LibrariesWorkbookPage-------
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.libraries.label=JARs &and class folders on the build path:
|
|
||||||
LibrariesWorkbookPage.libraries.remove.button=&Remove
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.libraries.addjar.button=Add &JARs...
|
|
||||||
LibrariesWorkbookPage.libraries.addextjar.button=Add E&xternal JARs...
|
|
||||||
LibrariesWorkbookPage.libraries.addvariable.button=Add &Variable...
|
|
||||||
LibrariesWorkbookPage.libraries.addlibrary.button=Add Li&brary...
|
|
||||||
LibrariesWorkbookPage.libraries.addclassfolder.button=Add Class &Folder...
|
|
||||||
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.libraries.edit.button=&Edit...
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.ExistingClassFolderDialog.new.title=Class Folder Selection
|
|
||||||
LibrariesWorkbookPage.ExistingClassFolderDialog.new.description=&Choose class folders to be added to the build path:
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.ExistingClassFolderDialog.edit.title=Edit Class Folder
|
|
||||||
LibrariesWorkbookPage.ExistingClassFolderDialog.edit.description=&Select the class folder:
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.NewClassFolderDialog.new.title=New Class Folder
|
|
||||||
LibrariesWorkbookPage.NewClassFolderDialog.edit.title=Edit Class Folder
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.NewClassFolderDialog.description=&Enter a path relative to ''{0}'':
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.JARArchiveDialog.new.title=JAR Selection
|
|
||||||
LibrariesWorkbookPage.JARArchiveDialog.new.description=&Choose jar archives to be added to the build path:
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.JARArchiveDialog.edit.title=Edit JAR
|
|
||||||
LibrariesWorkbookPage.JARArchiveDialog.edit.description=&Select the jar archive:
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.ContainerDialog.new.title=Add Library
|
|
||||||
LibrariesWorkbookPage.ContainerDialog.edit.title=Edit Library
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.VariableSelectionDialog.new.title=New Variable Classpath Entry
|
|
||||||
LibrariesWorkbookPage.VariableSelectionDialog.edit.title=Edit Variable Entry
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.ExtJARArchiveDialog.new.title=JAR Selection
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.ExtJARArchiveDialog.edit.title=Edit JAR
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.SourceAttachmentDialog.title=Source For ''{0}''
|
|
||||||
LibrariesWorkbookPage.JavadocPropertyDialog.title=Javadoc For ''{0}''
|
|
||||||
|
|
||||||
LibrariesWorkbookPage.AdvancedDialog.title=Add Classpath Entry
|
|
||||||
LibrariesWorkbookPage.AdvancedDialog.description=Select the entry to add to the classpath:
|
|
||||||
LibrariesWorkbookPage.AdvancedDialog.createfolder=Create &New Class Folder
|
|
||||||
LibrariesWorkbookPage.AdvancedDialog.addfolder=Add &Existing Class Folder
|
|
||||||
LibrariesWorkbookPage.AdvancedDialog.addcontainer=Add &Container:
|
|
||||||
|
|
||||||
# ------- NewContainerDialog-------
|
# ------- NewContainerDialog-------
|
||||||
|
|
||||||
NewContainerDialog.error.invalidpath=Invalid folder path: ''{0}''
|
NewContainerDialog.error.invalidpath=Invalid folder path: ''{0}''
|
||||||
|
@ -403,6 +280,9 @@ NewContainerDialog.error.enterpath=Folder name must be entered
|
||||||
NewContainerDialog.error.pathexists=This folder is already in the list or it is an output folder.
|
NewContainerDialog.error.pathexists=This folder is already in the list or it is an output folder.
|
||||||
# ------- NewSourceFolderDialog-------
|
# ------- NewSourceFolderDialog-------
|
||||||
|
|
||||||
|
NewSourceFolderDialog.useproject.button=&Project as source folder
|
||||||
|
NewSourceFolderDialog.usefolder.button=&Folder as source folder
|
||||||
|
NewSourceFolderDialog.sourcefolder.label=&Source folder name:
|
||||||
NewSourceFolderDialog.error.invalidpath=Invalid folder path: ''{0}''
|
NewSourceFolderDialog.error.invalidpath=Invalid folder path: ''{0}''
|
||||||
NewSourceFolderDialog.error.enterpath=Folder name must be entered.
|
NewSourceFolderDialog.error.enterpath=Folder name must be entered.
|
||||||
NewSourceFolderDialog.error.pathexists=The folder is already in the list.
|
NewSourceFolderDialog.error.pathexists=The folder is already in the list.
|
||||||
|
@ -528,68 +408,10 @@ OutputLocationDialog.error.invalidpath=Invalid path: {0}
|
||||||
OutputLocationDialog.ChooseOutputFolder.title=Folder Selection
|
OutputLocationDialog.ChooseOutputFolder.title=Folder Selection
|
||||||
OutputLocationDialog.ChooseOutputFolder.description=&Choose the folder for the build output:
|
OutputLocationDialog.ChooseOutputFolder.description=&Choose the folder for the build output:
|
||||||
|
|
||||||
# ------- ExclusionPatternDialog -------
|
|
||||||
|
|
||||||
ExclusionPatternDialog.title=Source Folder Exclusion Patterns
|
|
||||||
|
|
||||||
ExclusionPatternDialog.pattern.label=E&xclusion patterns for ''{0}'':
|
|
||||||
ExclusionPatternDialog.pattern.add=A&dd...
|
|
||||||
ExclusionPatternDialog.pattern.add.multiple=Add &Multiple...
|
|
||||||
ExclusionPatternDialog.pattern.remove=&Remove
|
|
||||||
ExclusionPatternDialog.pattern.edit=&Edit...
|
|
||||||
|
|
||||||
ExclusionPatternDialog.ChooseExclusionPattern.title=Exclusion Pattern Selection
|
|
||||||
ExclusionPatternDialog.ChooseExclusionPattern.description=&Choose folders or files to exclude:
|
|
||||||
|
|
||||||
# ------- ExclusionPatternEntryDialog -------
|
|
||||||
|
|
||||||
ExclusionPatternEntryDialog.add.title=Add Exclusion Pattern
|
|
||||||
ExclusionPatternEntryDialog.edit.title=Edit Exclusion Pattern
|
|
||||||
ExclusionPatternEntryDialog.description=Enter a pattern for excluding files from the source folder. Allowed wildcards are '*', '?' and '**'. Examples: 'java/util/A*.java', 'java/util/', '**/Test*'.
|
|
||||||
|
|
||||||
ExclusionPatternEntryDialog.pattern.label=E&xclusion pattern (Path relative to ''{0}''):
|
|
||||||
ExclusionPatternEntryDialog.pattern.button=Bro&wse...
|
|
||||||
|
|
||||||
ExclusionPatternEntryDialog.error.empty=Enter a pattern.
|
|
||||||
ExclusionPatternEntryDialog.error.notrelative=Pattern must be a relative path.
|
|
||||||
ExclusionPatternEntryDialog.error.exists=Pattern already exists.
|
|
||||||
|
|
||||||
ExclusionPatternEntryDialog.ChooseExclusionPattern.title=Exclusion Pattern Selection
|
|
||||||
ExclusionPatternEntryDialog.ChooseExclusionPattern.description=&Choose a folder or file to exclude:
|
|
||||||
|
|
||||||
# ------- ClasspathContainerDefaultPage-------
|
|
||||||
|
|
||||||
ClasspathContainerDefaultPage.title=Classpath Container
|
|
||||||
ClasspathContainerDefaultPage.description=Select classpath container path. First segment is the container type.
|
|
||||||
|
|
||||||
ClasspathContainerDefaultPage.path.label=&Classpath container path:
|
|
||||||
|
|
||||||
ClasspathContainerDefaultPage.path.error.enterpath=Enter path.
|
|
||||||
ClasspathContainerDefaultPage.path.error.invalidpath=Invalid path.
|
|
||||||
ClasspathContainerDefaultPage.path.error.needssegment=Path needs at least one segment.
|
|
||||||
ClasspathContainerDefaultPage.path.error.alreadyexists=Entry already exists.
|
|
||||||
|
|
||||||
# ------- ClasspathContainerSelectionPage-------
|
|
||||||
|
|
||||||
ClasspathContainerSelectionPage.title=Add Library
|
|
||||||
ClasspathContainerSelectionPage.description=Select the library type to add.
|
|
||||||
|
|
||||||
# ------- ClasspathContainerWizard-------
|
# ------- ClasspathContainerWizard-------
|
||||||
|
|
||||||
ClasspathContainerWizard.pagecreationerror.title= Library Wizard
|
ClasspathContainerWizard.pagecreationerror.title= Library Wizard
|
||||||
ClasspathContainerWizard.pagecreationerror.message=Wizard page creation failed. Check log for details.
|
ClasspathContainerWizard.pagecreationerror.message=Wizard page creation failed. Check log for details.
|
||||||
|
|
||||||
|
FolderSelectionDialog.button=Create &New Folder...
|
||||||
FolderSelectionDialog.button=Create New Folder...
|
MultipleFolderSelectionDialog.button=Create &New Folder...
|
||||||
CPListLabelProvider.none=(None)
|
|
||||||
CPListLabelProvider.source_attachment.label=Source attachment:
|
|
||||||
CPListLabelProvider.source_attachment_root.label=Source attachment root:
|
|
||||||
CPListLabelProvider.javadoc_location.label=Javadoc location:
|
|
||||||
CPListLabelProvider.output_folder.label=Output folder:
|
|
||||||
CPListLabelProvider.default_output_folder.label=(Default output folder)
|
|
||||||
CPListLabelProvider.exclusion_filter.label=Exclusion filter:
|
|
||||||
CPListLabelProvider.exclusion_filter_separator=;
|
|
||||||
CPListLabelProvider.unknown_element.label=unknown element
|
|
||||||
NewSourceFolderDialog.useproject.button=&Project as source folder
|
|
||||||
NewSourceFolderDialog.usefolder.button=&Folder as source folder
|
|
||||||
NewSourceFolderDialog.sourcefolder.label=&Source folder name:
|
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.wizards;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
|
||||||
|
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of a <code>ISelectionValidator</code> to validate the
|
||||||
|
* type of an element.
|
||||||
|
* Empty selections are not accepted.
|
||||||
|
*/
|
||||||
|
public class TypedElementSelectionValidator implements ISelectionStatusValidator {
|
||||||
|
|
||||||
|
private IStatus fgErrorStatus= new StatusInfo(IStatus.ERROR, ""); //$NON-NLS-1$
|
||||||
|
private IStatus fgOKStatus= new StatusInfo();
|
||||||
|
|
||||||
|
private Class[] fAcceptedTypes;
|
||||||
|
private boolean fAllowMultipleSelection;
|
||||||
|
private Collection fRejectedElements;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param acceptedTypes The types accepted by the validator
|
||||||
|
* @param allowMultipleSelection If set to <code>true</code>, the validator
|
||||||
|
* allows multiple selection.
|
||||||
|
*/
|
||||||
|
public TypedElementSelectionValidator(Class[] acceptedTypes, boolean allowMultipleSelection) {
|
||||||
|
this(acceptedTypes, allowMultipleSelection, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param acceptedTypes The types accepted by the validator
|
||||||
|
* @param allowMultipleSelection If set to <code>true</code>, the validator
|
||||||
|
* allows multiple selection.
|
||||||
|
* @param rejectedElements A list of elements that are not accepted
|
||||||
|
*/
|
||||||
|
public TypedElementSelectionValidator(Class[] acceptedTypes, boolean allowMultipleSelection, Collection rejectedElements) {
|
||||||
|
Assert.isNotNull(acceptedTypes);
|
||||||
|
fAcceptedTypes= acceptedTypes;
|
||||||
|
fAllowMultipleSelection= allowMultipleSelection;
|
||||||
|
fRejectedElements= rejectedElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.dialogs.ISelectionValidator#isValid(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public IStatus validate(Object[] elements) {
|
||||||
|
if (isValid(elements)) {
|
||||||
|
return fgOKStatus;
|
||||||
|
}
|
||||||
|
return fgErrorStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isOfAcceptedType(Object o) {
|
||||||
|
for (int i= 0; i < fAcceptedTypes.length; i++) {
|
||||||
|
if (fAcceptedTypes[i].isInstance(o)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRejectedElement(Object elem) {
|
||||||
|
return (fRejectedElements != null) && fRejectedElements.contains(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValid(Object[] selection) {
|
||||||
|
if (selection.length == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fAllowMultipleSelection && selection.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i= 0; i < selection.length; i++) {
|
||||||
|
Object o= selection[i];
|
||||||
|
if (!isOfAcceptedType(o) || isRejectedElement(o)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.wizards;
|
||||||
|
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.jface.viewers.ViewerFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Viewer filter used in selection dialogs.
|
||||||
|
*/
|
||||||
|
public class TypedViewerFilter extends ViewerFilter {
|
||||||
|
|
||||||
|
private Class[] fAcceptedTypes;
|
||||||
|
private Object[] fRejectedElements;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a filter that only allows elements of gives types.
|
||||||
|
* @param acceptedTypes The types of accepted elements
|
||||||
|
*/
|
||||||
|
public TypedViewerFilter(Class[] acceptedTypes) {
|
||||||
|
this(acceptedTypes, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a filter that only allows elements of gives types, but not from a
|
||||||
|
* list of rejected elements.
|
||||||
|
* @param acceptedTypes Accepted elements must be of this types
|
||||||
|
* @param rejectedElements Element equals to the rejected elements are
|
||||||
|
* filtered out
|
||||||
|
*/
|
||||||
|
public TypedViewerFilter(Class[] acceptedTypes, Object[] rejectedElements) {
|
||||||
|
Assert.isNotNull(acceptedTypes);
|
||||||
|
fAcceptedTypes= acceptedTypes;
|
||||||
|
fRejectedElements= rejectedElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ViewerFilter#select
|
||||||
|
*/
|
||||||
|
public boolean select(Viewer viewer, Object parentElement, Object element) {
|
||||||
|
if (fRejectedElements != null) {
|
||||||
|
for (int i= 0; i < fRejectedElements.length; i++) {
|
||||||
|
if (element.equals(fRejectedElements[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i= 0; i < fAcceptedTypes.length; i++) {
|
||||||
|
if (fAcceptedTypes[i].isInstance(element)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2003 IBM Corporation 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:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.wizards.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.events.KeyEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change listener used by <code>TreeListDialogField</code>
|
||||||
|
*/
|
||||||
|
public interface ITreeListAdapter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A button from the button bar has been pressed.
|
||||||
|
*/
|
||||||
|
void customButtonPressed(TreeListDialogField field, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The selection of the list has changed.
|
||||||
|
*/
|
||||||
|
void selectionChanged(TreeListDialogField field);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list has been double clicked
|
||||||
|
*/
|
||||||
|
void doubleClicked(TreeListDialogField field);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A key has been pressed
|
||||||
|
*/
|
||||||
|
void keyPressed(TreeListDialogField field, KeyEvent event);
|
||||||
|
|
||||||
|
Object[] getChildren(TreeListDialogField field, Object element);
|
||||||
|
|
||||||
|
Object getParent(TreeListDialogField field, Object element);
|
||||||
|
|
||||||
|
boolean hasChildren(TreeListDialogField field, Object element);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,904 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 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.wizards.dialogfields;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.KeyAdapter;
|
||||||
|
import org.eclipse.swt.events.KeyEvent;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.events.SelectionListener;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Tree;
|
||||||
|
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
import org.eclipse.jface.viewers.DoubleClickEvent;
|
||||||
|
import org.eclipse.jface.viewers.IDoubleClickListener;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
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.viewers.Viewer;
|
||||||
|
import org.eclipse.jface.viewers.ViewerSorter;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.util.PixelConverter;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.SWTUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list with a button bar. Typical buttons are 'Add', 'Remove', 'Up' and
|
||||||
|
* 'Down'. List model is independend of widget creation. DialogFields controls
|
||||||
|
* are: Label, List and Composite containing buttons.
|
||||||
|
*/
|
||||||
|
public class TreeListDialogField extends DialogField {
|
||||||
|
|
||||||
|
protected TreeViewer fTree;
|
||||||
|
protected ILabelProvider fLabelProvider;
|
||||||
|
protected TreeViewerAdapter fTreeViewerAdapter;
|
||||||
|
protected List fElements;
|
||||||
|
protected ViewerSorter fViewerSorter;
|
||||||
|
|
||||||
|
protected String[] fButtonLabels;
|
||||||
|
private Button[] fButtonControls;
|
||||||
|
|
||||||
|
private boolean[] fButtonsEnabled;
|
||||||
|
|
||||||
|
private int fRemoveButtonIndex;
|
||||||
|
private int fUpButtonIndex;
|
||||||
|
private int fDownButtonIndex;
|
||||||
|
|
||||||
|
private Label fLastSeparator;
|
||||||
|
|
||||||
|
private Tree fTreeControl;
|
||||||
|
private Composite fButtonsControl;
|
||||||
|
private ISelection fSelectionWhenEnabled;
|
||||||
|
|
||||||
|
private ITreeListAdapter fTreeAdapter;
|
||||||
|
|
||||||
|
private Object fParentElement;
|
||||||
|
private int fTreeExpandLevel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param adapter
|
||||||
|
* Can be <code>null</code>.
|
||||||
|
*/
|
||||||
|
public TreeListDialogField(ITreeListAdapter adapter, String[] buttonLabels, ILabelProvider lprovider) {
|
||||||
|
super();
|
||||||
|
fTreeAdapter = adapter;
|
||||||
|
|
||||||
|
fLabelProvider = lprovider;
|
||||||
|
fTreeViewerAdapter = new TreeViewerAdapter();
|
||||||
|
fParentElement = this;
|
||||||
|
|
||||||
|
fElements = new ArrayList(10);
|
||||||
|
|
||||||
|
fButtonLabels = buttonLabels;
|
||||||
|
if (fButtonLabels != null) {
|
||||||
|
int nButtons = fButtonLabels.length;
|
||||||
|
fButtonsEnabled = new boolean[nButtons];
|
||||||
|
for (int i = 0; i < nButtons; i++) {
|
||||||
|
fButtonsEnabled[i] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fTree = null;
|
||||||
|
fTreeControl = null;
|
||||||
|
fButtonsControl = null;
|
||||||
|
|
||||||
|
fRemoveButtonIndex = -1;
|
||||||
|
fUpButtonIndex = -1;
|
||||||
|
fDownButtonIndex = -1;
|
||||||
|
|
||||||
|
fTreeExpandLevel = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the index of the 'remove' button in the button label array passed in
|
||||||
|
* the constructor. The behaviour of the button marked as the 'remove'
|
||||||
|
* button will then behandled internally. (enable state, button invocation
|
||||||
|
* behaviour)
|
||||||
|
*/
|
||||||
|
public void setRemoveButtonIndex(int removeButtonIndex) {
|
||||||
|
Assert.isTrue(removeButtonIndex < fButtonLabels.length);
|
||||||
|
fRemoveButtonIndex = removeButtonIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the index of the 'up' button in the button label array passed in the
|
||||||
|
* constructor. The behaviour of the button marked as the 'up' button will
|
||||||
|
* then behandled internally. (enable state, button invocation behaviour)
|
||||||
|
*/
|
||||||
|
public void setUpButtonIndex(int upButtonIndex) {
|
||||||
|
Assert.isTrue(upButtonIndex < fButtonLabels.length);
|
||||||
|
fUpButtonIndex = upButtonIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the index of the 'down' button in the button label array passed in
|
||||||
|
* the constructor. The behaviour of the button marked as the 'down' button
|
||||||
|
* will then be handled internally. (enable state, button invocation
|
||||||
|
* behaviour)
|
||||||
|
*/
|
||||||
|
public void setDownButtonIndex(int downButtonIndex) {
|
||||||
|
Assert.isTrue(downButtonIndex < fButtonLabels.length);
|
||||||
|
fDownButtonIndex = downButtonIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the viewerSorter.
|
||||||
|
*
|
||||||
|
* @param viewerSorter
|
||||||
|
* The viewerSorter to set
|
||||||
|
*/
|
||||||
|
public void setViewerSorter(ViewerSorter viewerSorter) {
|
||||||
|
fViewerSorter = viewerSorter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the viewerSorter.
|
||||||
|
*
|
||||||
|
* @param viewerSorter
|
||||||
|
* The viewerSorter to set
|
||||||
|
*/
|
||||||
|
public void setTreeExpansionLevel(int level) {
|
||||||
|
fTreeExpandLevel = level;
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.expandToLevel(level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ adapter communication
|
||||||
|
|
||||||
|
private void buttonPressed(int index) {
|
||||||
|
if (!managedButtonPressed(index) && fTreeAdapter != null) {
|
||||||
|
fTreeAdapter.customButtonPressed(this, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the button pressed is handled internally
|
||||||
|
*
|
||||||
|
* @return Returns true if button has been handled.
|
||||||
|
*/
|
||||||
|
protected boolean managedButtonPressed(int index) {
|
||||||
|
if (index == fRemoveButtonIndex) {
|
||||||
|
remove();
|
||||||
|
} else if (index == fUpButtonIndex) {
|
||||||
|
up();
|
||||||
|
} else if (index == fDownButtonIndex) {
|
||||||
|
down();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
PixelConverter converter = new PixelConverter(parent);
|
||||||
|
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Label label = getLabelControl(parent);
|
||||||
|
GridData gd = gridDataForLabel(1);
|
||||||
|
gd.verticalAlignment = GridData.BEGINNING;
|
||||||
|
label.setLayoutData(gd);
|
||||||
|
|
||||||
|
Control list = getTreeControl(parent);
|
||||||
|
gd = new GridData();
|
||||||
|
gd.horizontalAlignment = GridData.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace = false;
|
||||||
|
gd.verticalAlignment = GridData.FILL;
|
||||||
|
gd.grabExcessVerticalSpace = true;
|
||||||
|
gd.horizontalSpan = nColumns - 2;
|
||||||
|
gd.widthHint = converter.convertWidthInCharsToPixels(50);
|
||||||
|
gd.heightHint = converter.convertHeightInCharsToPixels(6);
|
||||||
|
|
||||||
|
list.setLayoutData(gd);
|
||||||
|
|
||||||
|
Composite buttons = getButtonBox(parent);
|
||||||
|
gd = new GridData();
|
||||||
|
gd.horizontalAlignment = GridData.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace = false;
|
||||||
|
gd.verticalAlignment = GridData.FILL;
|
||||||
|
gd.grabExcessVerticalSpace = true;
|
||||||
|
gd.horizontalSpan = 1;
|
||||||
|
buttons.setLayoutData(gd);
|
||||||
|
|
||||||
|
return new Control[] { label, list, buttons};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the minimal width of the buttons. Must be called after widget
|
||||||
|
* creation.
|
||||||
|
*/
|
||||||
|
public void setButtonsMinWidth(int minWidth) {
|
||||||
|
if (fLastSeparator != null) {
|
||||||
|
((GridData) fLastSeparator.getLayoutData()).widthHint = minWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the tree control. When called the first time, the control will be
|
||||||
|
* created.
|
||||||
|
*
|
||||||
|
* @param The
|
||||||
|
* parent composite when called the first time, or <code>null</code>
|
||||||
|
* after.
|
||||||
|
*/
|
||||||
|
public Control getTreeControl(Composite parent) {
|
||||||
|
if (fTreeControl == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
|
||||||
|
fTree = createTreeViewer(parent);
|
||||||
|
|
||||||
|
fTreeControl = (Tree) fTree.getControl();
|
||||||
|
fTreeControl.addKeyListener(new KeyAdapter() {
|
||||||
|
|
||||||
|
public void keyPressed(KeyEvent e) {
|
||||||
|
handleKeyPressed(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fTree.setAutoExpandLevel(99);
|
||||||
|
fTree.setContentProvider(fTreeViewerAdapter);
|
||||||
|
fTree.setLabelProvider(fLabelProvider);
|
||||||
|
fTree.addSelectionChangedListener(fTreeViewerAdapter);
|
||||||
|
fTree.addDoubleClickListener(fTreeViewerAdapter);
|
||||||
|
|
||||||
|
fTree.setInput(fParentElement);
|
||||||
|
fTree.expandToLevel(fTreeExpandLevel);
|
||||||
|
|
||||||
|
if (fViewerSorter != null) {
|
||||||
|
fTree.setSorter(fViewerSorter);
|
||||||
|
}
|
||||||
|
|
||||||
|
fTreeControl.setEnabled(isEnabled());
|
||||||
|
if (fSelectionWhenEnabled != null) {
|
||||||
|
postSetSelection(fSelectionWhenEnabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fTreeControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the internally used table viewer.
|
||||||
|
*/
|
||||||
|
public TreeViewer getTreeViewer() {
|
||||||
|
return fTree;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Subclasses may override to specify a different style.
|
||||||
|
*/
|
||||||
|
protected int getTreeStyle() {
|
||||||
|
int style = SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TreeViewer createTreeViewer(Composite parent) {
|
||||||
|
Tree tree = new Tree(parent, getTreeStyle());
|
||||||
|
return new TreeViewer(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Button createButton(Composite parent, String label, SelectionListener listener) {
|
||||||
|
Button button = new Button(parent, SWT.PUSH);
|
||||||
|
button.setText(label);
|
||||||
|
button.addSelectionListener(listener);
|
||||||
|
GridData gd = new GridData();
|
||||||
|
gd.horizontalAlignment = GridData.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace = true;
|
||||||
|
gd.verticalAlignment = GridData.BEGINNING;
|
||||||
|
gd.heightHint = SWTUtil.getButtonHeigthHint(button);
|
||||||
|
gd.widthHint = SWTUtil.getButtonWidthHint(button);
|
||||||
|
|
||||||
|
button.setLayoutData(gd);
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Label createSeparator(Composite parent) {
|
||||||
|
Label separator = new Label(parent, SWT.NONE);
|
||||||
|
separator.setVisible(false);
|
||||||
|
GridData gd = new GridData();
|
||||||
|
gd.horizontalAlignment = GridData.FILL;
|
||||||
|
gd.verticalAlignment = GridData.BEGINNING;
|
||||||
|
gd.heightHint = 4;
|
||||||
|
separator.setLayoutData(gd);
|
||||||
|
return separator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the composite containing the buttons. When called the first time,
|
||||||
|
* the control will be created.
|
||||||
|
*
|
||||||
|
* @param The
|
||||||
|
* parent composite when called the first time, or <code>null</code>
|
||||||
|
* after.
|
||||||
|
*/
|
||||||
|
public Composite getButtonBox(Composite parent) {
|
||||||
|
if (fButtonsControl == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
|
||||||
|
SelectionListener listener = new SelectionListener() {
|
||||||
|
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
doButtonSelected(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
doButtonSelected(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Composite contents = new Composite(parent, SWT.NULL);
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.marginWidth = 0;
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
contents.setLayout(layout);
|
||||||
|
|
||||||
|
if (fButtonLabels != null) {
|
||||||
|
fButtonControls = new Button[fButtonLabels.length];
|
||||||
|
for (int i = 0; i < fButtonLabels.length; i++) {
|
||||||
|
String currLabel = fButtonLabels[i];
|
||||||
|
if (currLabel != null) {
|
||||||
|
fButtonControls[i] = createButton(contents, currLabel, listener);
|
||||||
|
fButtonControls[i].setEnabled(isEnabled() && fButtonsEnabled[i]);
|
||||||
|
} else {
|
||||||
|
fButtonControls[i] = null;
|
||||||
|
createSeparator(contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fLastSeparator = createSeparator(contents);
|
||||||
|
|
||||||
|
updateButtonState();
|
||||||
|
fButtonsControl = contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fButtonsControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doButtonSelected(SelectionEvent e) {
|
||||||
|
if (fButtonControls != null) {
|
||||||
|
for (int i = 0; i < fButtonControls.length; i++) {
|
||||||
|
if (e.widget == fButtonControls[i]) {
|
||||||
|
buttonPressed(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles key events in the table viewer. Specifically when the delete key
|
||||||
|
* is pressed.
|
||||||
|
*/
|
||||||
|
protected void handleKeyPressed(KeyEvent event) {
|
||||||
|
if (event.character == SWT.DEL && event.stateMask == 0) {
|
||||||
|
if (fRemoveButtonIndex != -1 && isButtonEnabled(fTree.getSelection(), fRemoveButtonIndex)) {
|
||||||
|
managedButtonPressed(fRemoveButtonIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fTreeAdapter.keyPressed(this, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#dialogFieldChanged
|
||||||
|
*/
|
||||||
|
public void dialogFieldChanged() {
|
||||||
|
super.dialogFieldChanged();
|
||||||
|
updateButtonState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Updates the enable state of the all buttons
|
||||||
|
*/
|
||||||
|
protected void updateButtonState() {
|
||||||
|
if (fButtonControls != null) {
|
||||||
|
ISelection sel = fTree.getSelection();
|
||||||
|
for (int i = 0; i < fButtonControls.length; i++) {
|
||||||
|
Button button = fButtonControls[i];
|
||||||
|
if (isOkToUse(button)) {
|
||||||
|
button.setEnabled(isButtonEnabled(sel, i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean containsAttributes(List selected) {
|
||||||
|
for (int i = 0; i < selected.size(); i++) {
|
||||||
|
if (!fElements.contains(selected.get(i))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean getManagedButtonState(ISelection sel, int index) {
|
||||||
|
List selected = getSelectedElements();
|
||||||
|
boolean hasAttributes = containsAttributes(selected);
|
||||||
|
if (index == fRemoveButtonIndex) {
|
||||||
|
return !selected.isEmpty() && !hasAttributes;
|
||||||
|
} else if (index == fUpButtonIndex) {
|
||||||
|
return !sel.isEmpty() && !hasAttributes && canMoveUp(selected);
|
||||||
|
} else if (index == fDownButtonIndex) {
|
||||||
|
return !sel.isEmpty() && !hasAttributes && canMoveDown(selected);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
|
||||||
|
boolean enabled = isEnabled();
|
||||||
|
if (isOkToUse(fTreeControl)) {
|
||||||
|
if (!enabled) {
|
||||||
|
fSelectionWhenEnabled = fTree.getSelection();
|
||||||
|
selectElements(null);
|
||||||
|
} else {
|
||||||
|
selectElements(fSelectionWhenEnabled);
|
||||||
|
fSelectionWhenEnabled = null;
|
||||||
|
}
|
||||||
|
fTreeControl.setEnabled(enabled);
|
||||||
|
}
|
||||||
|
updateButtonState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a button enabled or disabled.
|
||||||
|
*/
|
||||||
|
public void enableButton(int index, boolean enable) {
|
||||||
|
if (fButtonsEnabled != null && index < fButtonsEnabled.length) {
|
||||||
|
fButtonsEnabled[index] = enable;
|
||||||
|
updateButtonState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isButtonEnabled(ISelection sel, int index) {
|
||||||
|
boolean extraState = getManagedButtonState(sel, index);
|
||||||
|
return isEnabled() && extraState && fButtonsEnabled[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ model access
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the elements shown in the list.
|
||||||
|
*/
|
||||||
|
public void setElements(List elements) {
|
||||||
|
fElements = new ArrayList(elements);
|
||||||
|
refresh();
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.expandToLevel(fTreeExpandLevel);
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the elements shown in the list. The list returned is a copy, so it
|
||||||
|
* can be modified by the user.
|
||||||
|
*/
|
||||||
|
public List getElements() {
|
||||||
|
return new ArrayList(fElements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the element shown at the given index.
|
||||||
|
*/
|
||||||
|
public Object getElement(int index) {
|
||||||
|
return fElements.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the index of an element in the list or -1 if element is not in list.
|
||||||
|
*/
|
||||||
|
public int getIndexOfElement(Object elem) {
|
||||||
|
return fElements.indexOf(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace an element.
|
||||||
|
*/
|
||||||
|
public void replaceElement(Object oldElement, Object newElement) throws IllegalArgumentException {
|
||||||
|
int idx = fElements.indexOf(oldElement);
|
||||||
|
if (idx != -1) {
|
||||||
|
fElements.set(idx, newElement);
|
||||||
|
if (fTree != null) {
|
||||||
|
List selected = getSelectedElements();
|
||||||
|
if (selected.remove(oldElement)) {
|
||||||
|
selected.add(newElement);
|
||||||
|
}
|
||||||
|
boolean isExpanded = fTree.getExpandedState(oldElement);
|
||||||
|
fTree.remove(oldElement);
|
||||||
|
fTree.add(fParentElement, newElement);
|
||||||
|
if (isExpanded) {
|
||||||
|
fTree.expandToLevel(newElement, fTreeExpandLevel);
|
||||||
|
}
|
||||||
|
selectElements(new StructuredSelection(selected));
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an element at the end of the tree list.
|
||||||
|
*/
|
||||||
|
public void addElement(Object element) {
|
||||||
|
if (fElements.contains(element)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fElements.add(element);
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.add(fParentElement, element);
|
||||||
|
fTree.expandToLevel(element, fTreeExpandLevel);
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds elements at the end of the tree list.
|
||||||
|
*/
|
||||||
|
public void addElements(List elements) {
|
||||||
|
int nElements = elements.size();
|
||||||
|
|
||||||
|
if (nElements > 0) {
|
||||||
|
// filter duplicated
|
||||||
|
ArrayList elementsToAdd = new ArrayList(nElements);
|
||||||
|
|
||||||
|
for (int i = 0; i < nElements; i++) {
|
||||||
|
Object elem = elements.get(i);
|
||||||
|
if (!fElements.contains(elem)) {
|
||||||
|
elementsToAdd.add(elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fElements.addAll(elementsToAdd);
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.add(fParentElement, elementsToAdd.toArray());
|
||||||
|
for (int i = 0; i < elementsToAdd.size(); i++) {
|
||||||
|
fTree.expandToLevel(elementsToAdd.get(i), fTreeExpandLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an element at a position.
|
||||||
|
*/
|
||||||
|
public void insertElementAt(Object element, int index) {
|
||||||
|
if (fElements.contains(element)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fElements.add(index, element);
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.add(fParentElement, element);
|
||||||
|
if (fTreeExpandLevel != -1) {
|
||||||
|
fTree.expandToLevel(element, fTreeExpandLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an element at a position.
|
||||||
|
*/
|
||||||
|
public void removeAllElements() {
|
||||||
|
if (fElements.size() > 0) {
|
||||||
|
fElements.clear();
|
||||||
|
refresh();
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an element from the list.
|
||||||
|
*/
|
||||||
|
public void removeElement(Object element) throws IllegalArgumentException {
|
||||||
|
if (fElements.remove(element)) {
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.remove(element);
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes elements from the list.
|
||||||
|
*/
|
||||||
|
public void removeElements(List elements) {
|
||||||
|
if (elements.size() > 0) {
|
||||||
|
fElements.removeAll(elements);
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.remove(elements.toArray());
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of elements
|
||||||
|
*/
|
||||||
|
public int getSize() {
|
||||||
|
return fElements.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectElements(ISelection selection) {
|
||||||
|
fSelectionWhenEnabled = selection;
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.setSelection(selection, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectFirstElement() {
|
||||||
|
Object element = null;
|
||||||
|
if (fViewerSorter != null) {
|
||||||
|
Object[] arr = fElements.toArray();
|
||||||
|
fViewerSorter.sort(fTree, arr);
|
||||||
|
if (arr.length > 0) {
|
||||||
|
element = arr[0];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (fElements.size() > 0) {
|
||||||
|
element = fElements.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (element != null) {
|
||||||
|
selectElements(new StructuredSelection(element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postSetSelection(final ISelection selection) {
|
||||||
|
if (isOkToUse(fTreeControl)) {
|
||||||
|
Display d = fTreeControl.getDisplay();
|
||||||
|
d.asyncExec(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
if (isOkToUse(fTreeControl)) {
|
||||||
|
selectElements(selection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refreshes the tree.
|
||||||
|
*/
|
||||||
|
public void refresh() {
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refreshes the tree.
|
||||||
|
*/
|
||||||
|
public void refresh(Object element) {
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.refresh(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- list maintenance
|
||||||
|
|
||||||
|
private List moveUp(List elements, List move) {
|
||||||
|
int nElements = elements.size();
|
||||||
|
List res = new ArrayList(nElements);
|
||||||
|
Object floating = null;
|
||||||
|
for (int i = 0; i < nElements; i++) {
|
||||||
|
Object curr = elements.get(i);
|
||||||
|
if (move.contains(curr)) {
|
||||||
|
res.add(curr);
|
||||||
|
} else {
|
||||||
|
if (floating != null) {
|
||||||
|
res.add(floating);
|
||||||
|
}
|
||||||
|
floating = curr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (floating != null) {
|
||||||
|
res.add(floating);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveUp(List toMoveUp) {
|
||||||
|
if (toMoveUp.size() > 0) {
|
||||||
|
setElements(moveUp(fElements, toMoveUp));
|
||||||
|
fTree.reveal(toMoveUp.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveDown(List toMoveDown) {
|
||||||
|
if (toMoveDown.size() > 0) {
|
||||||
|
setElements(reverse(moveUp(reverse(fElements), toMoveDown)));
|
||||||
|
fTree.reveal(toMoveDown.get(toMoveDown.size() - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List reverse(List p) {
|
||||||
|
List reverse = new ArrayList(p.size());
|
||||||
|
for (int i = p.size() - 1; i >= 0; i--) {
|
||||||
|
reverse.add(p.get(i));
|
||||||
|
}
|
||||||
|
return reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void remove() {
|
||||||
|
removeElements(getSelectedElements());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void up() {
|
||||||
|
moveUp(getSelectedElements());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void down() {
|
||||||
|
moveDown(getSelectedElements());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canMoveUp(List selectedElements) {
|
||||||
|
if (isOkToUse(fTreeControl)) {
|
||||||
|
int nSelected = selectedElements.size();
|
||||||
|
int nElements = fElements.size();
|
||||||
|
for (int i = 0; i < nElements && nSelected > 0; i++) {
|
||||||
|
if (!selectedElements.contains(fElements.get(i))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
nSelected--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canMoveDown(List selectedElements) {
|
||||||
|
if (isOkToUse(fTreeControl)) {
|
||||||
|
int nSelected = selectedElements.size();
|
||||||
|
for (int i = fElements.size() - 1; i >= 0 && nSelected > 0; i--) {
|
||||||
|
if (!selectedElements.contains(fElements.get(i))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
nSelected--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selected elements.
|
||||||
|
*/
|
||||||
|
public List getSelectedElements() {
|
||||||
|
ArrayList result = new ArrayList();
|
||||||
|
if (fTree != null) {
|
||||||
|
ISelection selection = fTree.getSelection();
|
||||||
|
if (selection instanceof IStructuredSelection) {
|
||||||
|
Iterator iter = ((IStructuredSelection) selection).iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
result.add(iter.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void expandElement(Object element, int level) {
|
||||||
|
if (fTree != null) {
|
||||||
|
fTree.expandToLevel(element, level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- TreeViewerAdapter
|
||||||
|
|
||||||
|
private class TreeViewerAdapter implements ITreeContentProvider, ISelectionChangedListener, IDoubleClickListener {
|
||||||
|
|
||||||
|
private final Object[] NO_ELEMENTS = new Object[0];
|
||||||
|
|
||||||
|
// ------- ITreeContentProvider Interface ------------
|
||||||
|
|
||||||
|
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
|
||||||
|
// will never happen
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDeleted(Object element) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getElements(Object obj) {
|
||||||
|
return fElements.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getChildren(Object element) {
|
||||||
|
if (fTreeAdapter != null) {
|
||||||
|
return fTreeAdapter.getChildren(TreeListDialogField.this, element);
|
||||||
|
}
|
||||||
|
return NO_ELEMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getParent(Object element) {
|
||||||
|
if (!fElements.contains(element) && fTreeAdapter != null) {
|
||||||
|
return fTreeAdapter.getParent(TreeListDialogField.this, element);
|
||||||
|
}
|
||||||
|
return fParentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasChildren(Object element) {
|
||||||
|
if (fTreeAdapter != null) {
|
||||||
|
return fTreeAdapter.hasChildren(TreeListDialogField.this, element);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ISelectionChangedListener Interface ------------
|
||||||
|
|
||||||
|
public void selectionChanged(SelectionChangedEvent event) {
|
||||||
|
doListSelected(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
|
||||||
|
*/
|
||||||
|
public void doubleClick(DoubleClickEvent event) {
|
||||||
|
doDoubleClick(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doListSelected(SelectionChangedEvent event) {
|
||||||
|
updateButtonState();
|
||||||
|
if (fTreeAdapter != null) {
|
||||||
|
fTreeAdapter.selectionChanged(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doDoubleClick(DoubleClickEvent event) {
|
||||||
|
if (fTreeAdapter != null) {
|
||||||
|
fTreeAdapter.doubleClicked(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,171 +0,0 @@
|
||||||
package org.eclipse.cdt.internal.ui.wizards.swt;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (c) Copyright IBM Corp. 2000, 2001.
|
|
||||||
* All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
|
|
||||||
public final class MGridData {
|
|
||||||
/**
|
|
||||||
* verticalAlignment specifies how controls will be positioned
|
|
||||||
* vertically within a cell.
|
|
||||||
*
|
|
||||||
* The default value is CENTER.
|
|
||||||
*
|
|
||||||
* Possible values are:
|
|
||||||
*
|
|
||||||
* BEGINNING: Position the control at the top of the cell
|
|
||||||
* CENTER: Position the control in the vertical center of the cell
|
|
||||||
* END: Position the control at the bottom of the cell
|
|
||||||
* FILL: Resize the control to fill the cell vertically
|
|
||||||
*/
|
|
||||||
public int verticalAlignment= CENTER;
|
|
||||||
/**
|
|
||||||
* horizontalAlignment specifies how controls will be positioned
|
|
||||||
* horizontally within a cell.
|
|
||||||
*
|
|
||||||
* The default value is BEGINNING.
|
|
||||||
*
|
|
||||||
* Possible values are:
|
|
||||||
*
|
|
||||||
* BEGINNING: Position the control at the left of the cell
|
|
||||||
* CENTER: Position the control in the horizontal center of the cell
|
|
||||||
* END: Position the control at the right of the cell
|
|
||||||
* FILL: Resize the control to fill the cell horizontally
|
|
||||||
*/
|
|
||||||
public int horizontalAlignment= BEGINNING;
|
|
||||||
/**
|
|
||||||
* widthHint specifies a minimum width for the column. A value of
|
|
||||||
* SWT.DEFAULT indicates that no minimum width is specified.
|
|
||||||
*
|
|
||||||
* The default value is SWT.DEFAULT.
|
|
||||||
*/
|
|
||||||
public int widthHint= SWT.DEFAULT;
|
|
||||||
/**
|
|
||||||
* heightHint specifies a minimum height for the row. A value of
|
|
||||||
* SWT.DEFAULT indicates that no minimum height is specified.
|
|
||||||
*
|
|
||||||
* The default value is SWT.DEFAULT.
|
|
||||||
*/
|
|
||||||
public int heightHint= SWT.DEFAULT;
|
|
||||||
/**
|
|
||||||
* horizontalIndent specifies the number of pixels of indentation
|
|
||||||
* that will be placed along the left side of the cell.
|
|
||||||
*
|
|
||||||
* The default value is 0.
|
|
||||||
*/
|
|
||||||
public int horizontalIndent= 0;
|
|
||||||
/**
|
|
||||||
* horizontalSpan specifies the number of column cells that the control
|
|
||||||
* will take up.
|
|
||||||
*
|
|
||||||
* The default value is 1.
|
|
||||||
*/
|
|
||||||
public int horizontalSpan= 1;
|
|
||||||
/**
|
|
||||||
* verticalSpan specifies the number of row cells that the control
|
|
||||||
* will take up.
|
|
||||||
*
|
|
||||||
* The default value is 1.
|
|
||||||
*/
|
|
||||||
public int verticalSpan= 1;
|
|
||||||
/**
|
|
||||||
* grabExcessHorizontalSpace specifies whether the cell will be made
|
|
||||||
* wide enough to fit the remaining horizontal space.
|
|
||||||
*
|
|
||||||
* The default value is false.
|
|
||||||
*/
|
|
||||||
public boolean grabExcessHorizontalSpace= false;
|
|
||||||
/**
|
|
||||||
* grabExcessVerticalSpace specifies whether the cell will be made
|
|
||||||
* tall enough to fit the remaining vertical space.
|
|
||||||
*
|
|
||||||
* The default value is false.
|
|
||||||
*/
|
|
||||||
public boolean grabExcessVerticalSpace= false;
|
|
||||||
|
|
||||||
|
|
||||||
// --------- added to original GridData --------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* if a span is defined that is also grabing, this defines the column that
|
|
||||||
* will grab the space
|
|
||||||
*
|
|
||||||
* The default value is -1, which will result in the default behavior
|
|
||||||
* (=last culumn)
|
|
||||||
*/
|
|
||||||
public int grabColumn= -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If a span is defined that is also grabing, this defines the row that
|
|
||||||
* will grab
|
|
||||||
*
|
|
||||||
* The default value is -1, which will result in the default behavior
|
|
||||||
* (=last row)
|
|
||||||
*/
|
|
||||||
public int grabRow= -1;
|
|
||||||
|
|
||||||
// Alignment constants.
|
|
||||||
public static final int BEGINNING= 1;
|
|
||||||
public static final int CENTER= 2;
|
|
||||||
public static final int END= 3;
|
|
||||||
public static final int FILL= 4;
|
|
||||||
|
|
||||||
// Style constants
|
|
||||||
public static final int VERTICAL_ALIGN_BEGINNING= 1 << 1;
|
|
||||||
public static final int VERTICAL_ALIGN_CENTER= 1 << 2;
|
|
||||||
public static final int VERTICAL_ALIGN_END= 1 << 3;
|
|
||||||
public static final int VERTICAL_ALIGN_FILL= 1 << 4;
|
|
||||||
public static final int HORIZONTAL_ALIGN_BEGINNING= 1 << 5;
|
|
||||||
public static final int HORIZONTAL_ALIGN_CENTER= 1 << 6;
|
|
||||||
public static final int HORIZONTAL_ALIGN_END= 1 << 7;
|
|
||||||
public static final int HORIZONTAL_ALIGN_FILL= 1 << 8;
|
|
||||||
public static final int GRAB_HORIZONTAL= 1 << 9;
|
|
||||||
public static final int GRAB_VERTICAL= 1 << 10;
|
|
||||||
|
|
||||||
// Private
|
|
||||||
int childIndex;
|
|
||||||
boolean isItemData= true;
|
|
||||||
boolean isItemData() {
|
|
||||||
return isItemData;
|
|
||||||
}
|
|
||||||
boolean isSpacerData() {
|
|
||||||
return !isItemData;
|
|
||||||
}
|
|
||||||
public MGridData(int style) {
|
|
||||||
super();
|
|
||||||
|
|
||||||
if ((style & VERTICAL_ALIGN_BEGINNING) != 0)
|
|
||||||
verticalAlignment= BEGINNING;
|
|
||||||
if ((style & VERTICAL_ALIGN_CENTER) != 0)
|
|
||||||
verticalAlignment= CENTER;
|
|
||||||
if ((style & VERTICAL_ALIGN_FILL) != 0)
|
|
||||||
verticalAlignment= FILL;
|
|
||||||
if ((style & VERTICAL_ALIGN_END) != 0)
|
|
||||||
verticalAlignment= END;
|
|
||||||
|
|
||||||
if ((style & HORIZONTAL_ALIGN_BEGINNING) != 0)
|
|
||||||
horizontalAlignment= BEGINNING;
|
|
||||||
if ((style & HORIZONTAL_ALIGN_CENTER) != 0)
|
|
||||||
horizontalAlignment= CENTER;
|
|
||||||
if ((style & HORIZONTAL_ALIGN_FILL) != 0)
|
|
||||||
horizontalAlignment= FILL;
|
|
||||||
if ((style & HORIZONTAL_ALIGN_END) != 0)
|
|
||||||
horizontalAlignment= END;
|
|
||||||
|
|
||||||
if ((style & GRAB_HORIZONTAL) != 0)
|
|
||||||
grabExcessHorizontalSpace= true;
|
|
||||||
else
|
|
||||||
grabExcessHorizontalSpace= false;
|
|
||||||
if ((style & GRAB_VERTICAL) != 0)
|
|
||||||
grabExcessVerticalSpace= true;
|
|
||||||
else
|
|
||||||
grabExcessVerticalSpace= false;
|
|
||||||
|
|
||||||
}
|
|
||||||
public MGridData() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,682 +0,0 @@
|
||||||
package org.eclipse.cdt.internal.ui.wizards.swt;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* (c) Copyright IBM Corp. 2000, 2001.
|
|
||||||
* All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.Hashtable;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.graphics.Point;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.Control;
|
|
||||||
import org.eclipse.swt.widgets.Layout;
|
|
||||||
|
|
||||||
public final class MGridLayout extends Layout {
|
|
||||||
/**
|
|
||||||
* marginWidth specifies the number of pixels of horizontal margin
|
|
||||||
* that will be placed along the left and right edges of the layout.
|
|
||||||
*
|
|
||||||
* The default value is 5.
|
|
||||||
*/
|
|
||||||
public int marginWidth= 5;
|
|
||||||
/**
|
|
||||||
* marginHeight specifies the number of pixels of vertical margin
|
|
||||||
* that will be placed along the top and bottom edges of the layout.
|
|
||||||
*
|
|
||||||
* The default value is 5.
|
|
||||||
*/
|
|
||||||
public int marginHeight= 5;
|
|
||||||
/**
|
|
||||||
* numColumns specifies the number of cell columns in the layout.
|
|
||||||
*
|
|
||||||
* The default value is 1.
|
|
||||||
*/
|
|
||||||
public int numColumns= 1;
|
|
||||||
/**
|
|
||||||
* makeColumnsEqualWidth specifies whether all columns in the layout
|
|
||||||
* will be forced to have the same width.
|
|
||||||
*
|
|
||||||
* The default value is false.
|
|
||||||
*/
|
|
||||||
public boolean makeColumnsEqualWidth= false;
|
|
||||||
/**
|
|
||||||
* horizontalSpacing specifies the number of pixels between the right
|
|
||||||
* edge of one cell and the left edge of its neighbouring cell to
|
|
||||||
* the right.
|
|
||||||
*
|
|
||||||
* The default value is 5.
|
|
||||||
*/
|
|
||||||
public int horizontalSpacing= 5;
|
|
||||||
/**
|
|
||||||
* verticalSpacing specifies the number of pixels between the bottom
|
|
||||||
* edge of one cell and the top edge of its neighbouring cell underneath.
|
|
||||||
*
|
|
||||||
* The default value is 5.
|
|
||||||
*/
|
|
||||||
public int verticalSpacing= 5;
|
|
||||||
|
|
||||||
|
|
||||||
// --------- added to original GridLayout --------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* minimumWidth specifies a minimum width of this layout
|
|
||||||
* If SWT.DEFAULT is set, no minimum width is forced
|
|
||||||
*
|
|
||||||
* The default value is SWT.DEFAULT.
|
|
||||||
*/
|
|
||||||
public int minimumWidth= SWT.DEFAULT;
|
|
||||||
/**
|
|
||||||
* minimumHeight specifies a minimum height of this layout
|
|
||||||
* If SWT.DEFAULT is set, no minimum height is forced
|
|
||||||
*
|
|
||||||
* The default value is SWT.DEFAULT.
|
|
||||||
*/
|
|
||||||
public int minimumHeight= SWT.DEFAULT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* id specifies an identifier string for this layout.
|
|
||||||
*/
|
|
||||||
public String id;
|
|
||||||
|
|
||||||
// Private variables. Cached values used to cut down on grid calculations.
|
|
||||||
boolean initialLayout= true;
|
|
||||||
Vector grid= new Vector();
|
|
||||||
int[] pixelColumnWidths;
|
|
||||||
int[] pixelRowHeights;
|
|
||||||
int[] expandableColumns;
|
|
||||||
int[] expandableRows;
|
|
||||||
void adjustGridDimensions(Composite composite, boolean flushCache) {
|
|
||||||
// Ensure that widgets that span more than one row or column have enough space.
|
|
||||||
for (int row= 0; row < grid.size(); row++) {
|
|
||||||
for (int column= 0; column < numColumns; column++) {
|
|
||||||
MGridData spec= ((MGridData[]) grid.elementAt(row))[column];
|
|
||||||
if (spec.isItemData()) {
|
|
||||||
// Widgets spanning columns.
|
|
||||||
if (spec.horizontalSpan > 1) {
|
|
||||||
Control child= composite.getChildren()[spec.childIndex];
|
|
||||||
Point extent= child.computeSize(spec.widthHint, spec.heightHint, flushCache);
|
|
||||||
|
|
||||||
// Calculate the size of the widget's spanned columns.
|
|
||||||
int lastSpanIndex= column + spec.horizontalSpan;
|
|
||||||
int spannedSize= 0;
|
|
||||||
for (int c= column; c < lastSpanIndex; c++) {
|
|
||||||
spannedSize= spannedSize + pixelColumnWidths[c] + horizontalSpacing;
|
|
||||||
}
|
|
||||||
spannedSize= spannedSize - horizontalSpacing;
|
|
||||||
|
|
||||||
// If the spanned columns are not large enough to display the widget, adjust the column
|
|
||||||
// sizes to account for the extra space that is needed.
|
|
||||||
if (extent.x + spec.horizontalIndent > spannedSize) {
|
|
||||||
int extraSpaceNeeded= extent.x + spec.horizontalIndent - spannedSize;
|
|
||||||
int lastColumn= column + spec.horizontalSpan - 1;
|
|
||||||
int colWidth;
|
|
||||||
if (makeColumnsEqualWidth) {
|
|
||||||
// Evenly distribute the extra space amongst all of the columns.
|
|
||||||
int columnExtra= extraSpaceNeeded / numColumns;
|
|
||||||
int columnRemainder= extraSpaceNeeded % numColumns;
|
|
||||||
for (int i= 0; i < pixelColumnWidths.length; i++) {
|
|
||||||
colWidth= pixelColumnWidths[i] + columnExtra;
|
|
||||||
pixelColumnWidths[i]= colWidth;
|
|
||||||
}
|
|
||||||
colWidth= pixelColumnWidths[lastColumn] + columnRemainder;
|
|
||||||
pixelColumnWidths[lastColumn]= colWidth;
|
|
||||||
} else {
|
|
||||||
Vector localExpandableColumns= new Vector();
|
|
||||||
for (int i= column; i < lastColumn; i++) {
|
|
||||||
for (int j= 0; j < expandableColumns.length; j++) {
|
|
||||||
if (expandableColumns[j] == i) {
|
|
||||||
localExpandableColumns.addElement(new Integer(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (localExpandableColumns.size() > 0) {
|
|
||||||
// If any of the widget's columns grab excess space, allocate the space amongst those columns.
|
|
||||||
int columnExtra= extraSpaceNeeded / localExpandableColumns.size();
|
|
||||||
int columnRemainder= extraSpaceNeeded % localExpandableColumns.size();
|
|
||||||
for (int i= 0; i < localExpandableColumns.size(); i++) {
|
|
||||||
int expandableCol= ((Integer) localExpandableColumns.elementAt(i)).intValue();
|
|
||||||
colWidth= pixelColumnWidths[expandableCol] + columnExtra;
|
|
||||||
pixelColumnWidths[expandableCol]= colWidth;
|
|
||||||
}
|
|
||||||
colWidth= pixelColumnWidths[lastColumn] + columnRemainder;
|
|
||||||
pixelColumnWidths[lastColumn]= colWidth;
|
|
||||||
} else {
|
|
||||||
// Add the extra space to the widget's last column if none of its columns grab excess space.
|
|
||||||
colWidth= pixelColumnWidths[lastColumn] + extraSpaceNeeded;
|
|
||||||
pixelColumnWidths[lastColumn]= colWidth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Widgets spanning rows.
|
|
||||||
if (spec.verticalSpan > 1) {
|
|
||||||
Control child= composite.getChildren()[spec.childIndex];
|
|
||||||
Point extent= child.computeSize(spec.widthHint, spec.heightHint, flushCache);
|
|
||||||
|
|
||||||
// Calculate the size of the widget's spanned rows.
|
|
||||||
int lastSpanIndex= row + spec.verticalSpan;
|
|
||||||
int spannedSize= 0;
|
|
||||||
for (int r= row; r < lastSpanIndex; r++) {
|
|
||||||
spannedSize= spannedSize + pixelRowHeights[r] + verticalSpacing;
|
|
||||||
}
|
|
||||||
spannedSize= spannedSize - verticalSpacing;
|
|
||||||
// If the spanned rows are not large enough to display the widget, adjust the row
|
|
||||||
// sizes to account for the extra space that is needed.
|
|
||||||
if (extent.y > spannedSize) {
|
|
||||||
int extraSpaceNeeded= extent.y - spannedSize;
|
|
||||||
int lastRow= row + spec.verticalSpan - 1;
|
|
||||||
int rowHeight;
|
|
||||||
Vector localExpandableRows= new Vector();
|
|
||||||
for (int i= row; i < lastRow; i++) {
|
|
||||||
for (int j= 0; j < expandableRows.length; j++) {
|
|
||||||
if (expandableRows[j] == i) {
|
|
||||||
localExpandableRows.addElement(new Integer(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (localExpandableRows.size() > 0) {
|
|
||||||
// If any of the widget's rows grab excess space, allocate the space amongst those rows.
|
|
||||||
int rowExtra= extraSpaceNeeded / localExpandableRows.size();
|
|
||||||
int rowRemainder= extraSpaceNeeded % localExpandableRows.size();
|
|
||||||
for (int i= 0; i < localExpandableRows.size(); i++) {
|
|
||||||
int expandableRow= ((Integer) localExpandableRows.elementAt(i)).intValue();
|
|
||||||
rowHeight= pixelRowHeights[expandableRow] + rowExtra;
|
|
||||||
pixelRowHeights[expandableRow]= rowHeight;
|
|
||||||
}
|
|
||||||
rowHeight= pixelRowHeights[lastRow] + rowRemainder;
|
|
||||||
pixelRowHeights[lastRow]= rowHeight;
|
|
||||||
} else {
|
|
||||||
// Add the extra space to the widget's last row if no rows grab excess space.
|
|
||||||
rowHeight= pixelRowHeights[lastRow] + extraSpaceNeeded;
|
|
||||||
pixelRowHeights[lastRow]= rowHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void calculateGridDimensions(Composite composite, boolean flushCache) {
|
|
||||||
int maxWidth, childWidth, maxHeight, childHeight;
|
|
||||||
|
|
||||||
//
|
|
||||||
Control[] children= composite.getChildren();
|
|
||||||
Point[] childSizes= new Point[children.length];
|
|
||||||
pixelColumnWidths= new int[numColumns];
|
|
||||||
pixelRowHeights= new int[grid.size()];
|
|
||||||
|
|
||||||
// Loop through the grid by column to get the width that each column needs to be.
|
|
||||||
// Each column will be as wide as its widest widget.
|
|
||||||
for (int column= 0; column < numColumns; column++) {
|
|
||||||
maxWidth= 0;
|
|
||||||
for (int row= 0; row < grid.size(); row++) {
|
|
||||||
MGridData spec= ((MGridData[]) grid.elementAt(row))[column];
|
|
||||||
if (spec.isItemData()) {
|
|
||||||
Control child= children[spec.childIndex];
|
|
||||||
childSizes[spec.childIndex]= child.computeSize(spec.widthHint, spec.heightHint, flushCache);
|
|
||||||
childWidth= childSizes[spec.childIndex].x + spec.horizontalIndent;
|
|
||||||
if (spec.horizontalSpan == 1) {
|
|
||||||
maxWidth= Math.max(maxWidth, childWidth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Cache the values for later use.
|
|
||||||
pixelColumnWidths[column]= maxWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (makeColumnsEqualWidth) {
|
|
||||||
maxWidth= 0;
|
|
||||||
// Find the largest column size that is necessary and make each column that size.
|
|
||||||
for (int i= 0; i < numColumns; i++) {
|
|
||||||
maxWidth= Math.max(maxWidth, pixelColumnWidths[i]);
|
|
||||||
}
|
|
||||||
for (int i= 0; i < numColumns; i++) {
|
|
||||||
pixelColumnWidths[i]= maxWidth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop through the grid by row to get the height that each row needs to be.
|
|
||||||
// Each row will be as high as its tallest widget.
|
|
||||||
for (int row= 0; row < grid.size(); row++) {
|
|
||||||
maxHeight= 0;
|
|
||||||
for (int column= 0; column < numColumns; column++) {
|
|
||||||
MGridData spec= ((MGridData[]) grid.elementAt(row))[column];
|
|
||||||
if (spec.isItemData()) {
|
|
||||||
childHeight= childSizes[spec.childIndex].y;
|
|
||||||
if (spec.verticalSpan == 1) {
|
|
||||||
maxHeight= Math.max(maxHeight, childHeight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Cache the values for later use.
|
|
||||||
pixelRowHeights[row]= maxHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void computeExpandableCells() {
|
|
||||||
// If a widget grabs excess horizontal space, the last column that the widget spans
|
|
||||||
// will be expandable. Similarly, if a widget grabs excess vertical space, the
|
|
||||||
// last row that the widget spans will be expandable.
|
|
||||||
Hashtable growColumns= new Hashtable();
|
|
||||||
Hashtable growRows= new Hashtable();
|
|
||||||
for (int col= 0; col < numColumns; col++) {
|
|
||||||
for (int row= 0; row < grid.size(); row++) {
|
|
||||||
MGridData spec= ((MGridData[]) grid.elementAt(row))[col];
|
|
||||||
if (spec.grabExcessHorizontalSpace) {
|
|
||||||
if (spec.grabColumn >= 0 && spec.grabColumn < spec.horizontalSpan) {
|
|
||||||
growColumns.put(new Integer(col + spec.grabColumn), new Object());
|
|
||||||
} else {
|
|
||||||
growColumns.put(new Integer(col + spec.horizontalSpan - 1), new Object());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (spec.grabExcessVerticalSpace) {
|
|
||||||
if (spec.grabRow >= 0 && spec.grabRow < spec.verticalSpan) {
|
|
||||||
growRows.put(new Integer(row + spec.grabRow), new Object());
|
|
||||||
} else {
|
|
||||||
growRows.put(new Integer(row + spec.verticalSpan - 1), new Object());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cache the values. These values are used later during children layout.
|
|
||||||
int i= 0;
|
|
||||||
Enumeration enum= growColumns.keys();
|
|
||||||
expandableColumns= new int[growColumns.size()];
|
|
||||||
while (enum.hasMoreElements()) {
|
|
||||||
expandableColumns[i]= ((Integer) enum.nextElement()).intValue();
|
|
||||||
i= i + 1;
|
|
||||||
}
|
|
||||||
i= 0;
|
|
||||||
enum= growRows.keys();
|
|
||||||
expandableRows= new int[growRows.size()];
|
|
||||||
while (enum.hasMoreElements()) {
|
|
||||||
expandableRows[i]= ((Integer) enum.nextElement()).intValue();
|
|
||||||
i= i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Point computeLayoutSize(Composite composite, int wHint, int hHint, boolean flushCache) {
|
|
||||||
int totalMarginHeight, totalMarginWidth;
|
|
||||||
int totalWidth, totalHeight;
|
|
||||||
int cols, rows;
|
|
||||||
|
|
||||||
// Initialize the grid and other cached information that help with the grid layout.
|
|
||||||
if (grid.size() == 0) {
|
|
||||||
createGrid(composite);
|
|
||||||
calculateGridDimensions(composite, flushCache);
|
|
||||||
computeExpandableCells();
|
|
||||||
adjustGridDimensions(composite, flushCache);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
cols= numColumns;
|
|
||||||
rows= grid.size();
|
|
||||||
totalMarginHeight= marginHeight + composite.getBorderWidth();
|
|
||||||
totalMarginWidth= marginWidth + composite.getBorderWidth();
|
|
||||||
|
|
||||||
// The total width is the margin plus border width plus space between each column,
|
|
||||||
// plus the width of each column.
|
|
||||||
totalWidth= (totalMarginWidth * 2) + ((cols - 1) * horizontalSpacing);
|
|
||||||
|
|
||||||
//Add up the width of each column.
|
|
||||||
for (int i= 0; i < pixelColumnWidths.length; i++) {
|
|
||||||
totalWidth= totalWidth + pixelColumnWidths[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// The total height is the margin plus border height, plus space between each row,
|
|
||||||
// plus the height of the tallest child in each row.
|
|
||||||
totalHeight= (totalMarginHeight * 2) + ((rows - 1) * verticalSpacing);
|
|
||||||
|
|
||||||
//Add up the height of each row.
|
|
||||||
for (int i= 0; i < pixelRowHeights.length; i++) {
|
|
||||||
totalHeight= totalHeight + pixelRowHeights[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wHint != SWT.DEFAULT) {
|
|
||||||
totalWidth= wHint;
|
|
||||||
};
|
|
||||||
if (hHint != SWT.DEFAULT) {
|
|
||||||
totalHeight= hHint;
|
|
||||||
};
|
|
||||||
// The preferred extent is the width and height that will accomodate the grid's widgets.
|
|
||||||
return new Point(totalWidth, totalHeight);
|
|
||||||
}
|
|
||||||
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
|
|
||||||
|
|
||||||
if (composite.getChildren().length == 0)
|
|
||||||
return new Point(0, 0);
|
|
||||||
|
|
||||||
// Make sure that all of the composite children have a layout spec. Do this by
|
|
||||||
// using the initialLayout flag.
|
|
||||||
if (flushCache)
|
|
||||||
initialLayout= true;
|
|
||||||
if (initialLayout) {
|
|
||||||
initializeLayoutData(composite);
|
|
||||||
initialLayout= false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flushCache) {
|
|
||||||
// Cause the grid and its related information to be calculated
|
|
||||||
// again.
|
|
||||||
grid.removeAllElements();
|
|
||||||
}
|
|
||||||
|
|
||||||
Point size= computeLayoutSize(composite, wHint, hHint, flushCache);
|
|
||||||
if (minimumWidth != SWT.DEFAULT && size.x < minimumWidth) {
|
|
||||||
size.x= minimumWidth;
|
|
||||||
}
|
|
||||||
if (minimumHeight != SWT.DEFAULT && size.y < minimumHeight) {
|
|
||||||
size.y= minimumHeight;
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
void createGrid(Composite composite) {
|
|
||||||
int row, column, rowFill, columnFill;
|
|
||||||
Control[] children;
|
|
||||||
MGridData spacerSpec;
|
|
||||||
|
|
||||||
//
|
|
||||||
children= composite.getChildren();
|
|
||||||
|
|
||||||
//
|
|
||||||
grid.addElement(emptyRow());
|
|
||||||
row= 0;
|
|
||||||
column= 0;
|
|
||||||
|
|
||||||
// Loop through the children and place their associated layout specs in the
|
|
||||||
// grid. Placement occurs left to right, top to bottom (i.e., by row).
|
|
||||||
for (int i= 0; i < children.length; i++) {
|
|
||||||
// Find the first available spot in the grid.
|
|
||||||
Control child= children[i];
|
|
||||||
MGridData spec= (MGridData) child.getLayoutData();
|
|
||||||
while (((MGridData[]) grid.elementAt(row))[column] != null) {
|
|
||||||
column= column + 1;
|
|
||||||
if (column >= numColumns) {
|
|
||||||
row= row + 1;
|
|
||||||
column= 0;
|
|
||||||
if (row >= grid.size()) {
|
|
||||||
grid.addElement(emptyRow());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// See if the place will support the widget's horizontal span. If not, go to the
|
|
||||||
// next row.
|
|
||||||
if (column + spec.horizontalSpan - 1 >= numColumns) {
|
|
||||||
grid.addElement(emptyRow());
|
|
||||||
row= row + 1;
|
|
||||||
column= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The vertical span for the item will be at least 1. If it is > 1,
|
|
||||||
// add other rows to the grid.
|
|
||||||
for (int j= 2; j <= spec.verticalSpan; j++) {
|
|
||||||
if (row + j > grid.size()) {
|
|
||||||
grid.addElement(emptyRow());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store the layout spec. Also cache the childIndex. NOTE: That we assume the children of a
|
|
||||||
// composite are maintained in the order in which they are created and added to the composite.
|
|
||||||
((MGridData[]) grid.elementAt(row))[column]= spec;
|
|
||||||
spec.childIndex= i;
|
|
||||||
|
|
||||||
// Put spacers in the grid to account for the item's vertical and horizontal
|
|
||||||
// span.
|
|
||||||
rowFill= spec.verticalSpan - 1;
|
|
||||||
columnFill= spec.horizontalSpan - 1;
|
|
||||||
for (int r= 1; r <= rowFill; r++) {
|
|
||||||
for (int c= 0; c < spec.horizontalSpan; c++) {
|
|
||||||
spacerSpec= new MGridData();
|
|
||||||
spacerSpec.isItemData= false;
|
|
||||||
((MGridData[]) grid.elementAt(row + r))[column + c]= spacerSpec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int c= 1; c <= columnFill; c++) {
|
|
||||||
for (int r= 0; r < spec.verticalSpan; r++) {
|
|
||||||
spacerSpec= new MGridData();
|
|
||||||
spacerSpec.isItemData= false;
|
|
||||||
((MGridData[]) grid.elementAt(row + r))[column + c]= spacerSpec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
column= column + spec.horizontalSpan - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill out empty grid cells with spacers.
|
|
||||||
for (int k= column + 1; k < numColumns; k++) {
|
|
||||||
spacerSpec= new MGridData();
|
|
||||||
spacerSpec.isItemData= false;
|
|
||||||
((MGridData[]) grid.elementAt(row))[k]= spacerSpec;
|
|
||||||
}
|
|
||||||
for (int k= row + 1; k < grid.size(); k++) {
|
|
||||||
spacerSpec= new MGridData();
|
|
||||||
spacerSpec.isItemData= false;
|
|
||||||
((MGridData[]) grid.elementAt(k))[column]= spacerSpec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MGridData[] emptyRow() {
|
|
||||||
MGridData[] row= new MGridData[numColumns];
|
|
||||||
for (int i= 0; i < numColumns; i++) {
|
|
||||||
row[i]= null;
|
|
||||||
}
|
|
||||||
return row;
|
|
||||||
}
|
|
||||||
void initializeLayoutData(Composite composite) {
|
|
||||||
Control[] children= composite.getChildren();
|
|
||||||
for (int i= 0; i < children.length; i++) {
|
|
||||||
Control child= children[i];
|
|
||||||
if (child.getLayoutData() == null) {
|
|
||||||
child.setLayoutData(new MGridData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected void layout(Composite composite, boolean flushCache) {
|
|
||||||
//System.out.println("start layout " + id);
|
|
||||||
//new Error (). printStackTrace();
|
|
||||||
int[] columnWidths;
|
|
||||||
int[] rowHeights;
|
|
||||||
int rowSize, rowY, columnX;
|
|
||||||
int compositeWidth, compositeHeight;
|
|
||||||
int excessHorizontal, excessVertical;
|
|
||||||
Control[] children;
|
|
||||||
if (flushCache) {
|
|
||||||
// Cause the grid and its related information to be calculated
|
|
||||||
// again.
|
|
||||||
grid.removeAllElements();
|
|
||||||
}
|
|
||||||
children= composite.getChildren();
|
|
||||||
if (children.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//
|
|
||||||
Point extent= computeLayoutSize(composite, SWT.DEFAULT, SWT.DEFAULT, flushCache);
|
|
||||||
columnWidths= new int[numColumns];
|
|
||||||
for (int i= 0; i < pixelColumnWidths.length; i++) {
|
|
||||||
columnWidths[i]= pixelColumnWidths[i];
|
|
||||||
}
|
|
||||||
rowHeights= new int[grid.size()];
|
|
||||||
for (int i= 0; i < pixelRowHeights.length; i++) {
|
|
||||||
rowHeights[i]= pixelRowHeights[i];
|
|
||||||
}
|
|
||||||
int columnWidth= 0;
|
|
||||||
rowSize= Math.max(1, grid.size());
|
|
||||||
|
|
||||||
//
|
|
||||||
compositeWidth= extent.x;
|
|
||||||
compositeHeight= extent.y;
|
|
||||||
|
|
||||||
// Calculate whether or not there is any extra space or not enough space due to a resize
|
|
||||||
// operation. Then allocate/deallocate the space to columns and rows that are expandable.
|
|
||||||
// If a widget grabs excess space, its last column or row will be expandable.
|
|
||||||
excessHorizontal= composite.getClientArea().width - compositeWidth;
|
|
||||||
excessVertical= composite.getClientArea().height - compositeHeight;
|
|
||||||
|
|
||||||
// Allocate/deallocate horizontal space.
|
|
||||||
if (expandableColumns.length != 0) {
|
|
||||||
int excess, remainder, last;
|
|
||||||
int colWidth;
|
|
||||||
excess= excessHorizontal / expandableColumns.length;
|
|
||||||
remainder= excessHorizontal % expandableColumns.length;
|
|
||||||
last= 0;
|
|
||||||
for (int i= 0; i < expandableColumns.length; i++) {
|
|
||||||
int expandableCol= expandableColumns[i];
|
|
||||||
colWidth= columnWidths[expandableCol];
|
|
||||||
colWidth= colWidth + excess;
|
|
||||||
columnWidths[expandableCol]= colWidth;
|
|
||||||
last= Math.max(last, expandableCol);
|
|
||||||
}
|
|
||||||
colWidth= columnWidths[last];
|
|
||||||
colWidth= colWidth + remainder;
|
|
||||||
columnWidths[last]= colWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go through all specs in each expandable column and get the maximum specified
|
|
||||||
// widthHint. Use this as the minimumWidth for the column.
|
|
||||||
for (int i= 0; i < expandableColumns.length; i++) {
|
|
||||||
int expandableCol= expandableColumns[i];
|
|
||||||
int colWidth= columnWidths[expandableCol];
|
|
||||||
int minWidth= 0;
|
|
||||||
for (int j= 0; j < grid.size(); j++) {
|
|
||||||
MGridData[] row= (MGridData[]) grid.elementAt(j);
|
|
||||||
MGridData spec= row[expandableCol];
|
|
||||||
minWidth= Math.max(minWidth, spec.widthHint);
|
|
||||||
}
|
|
||||||
columnWidths[expandableCol]= Math.max(colWidth, minWidth);
|
|
||||||
}
|
|
||||||
// Allocate/deallocate vertical space.
|
|
||||||
if (expandableRows.length != 0) {
|
|
||||||
int excess, remainder, last;
|
|
||||||
int rowHeight;
|
|
||||||
excess= excessVertical / expandableRows.length;
|
|
||||||
remainder= excessVertical % expandableRows.length;
|
|
||||||
last= 0;
|
|
||||||
for (int i= 0; i < expandableRows.length; i++) {
|
|
||||||
int expandableRow= expandableRows[i];
|
|
||||||
rowHeight= rowHeights[expandableRow];
|
|
||||||
rowHeight= rowHeight + excess;
|
|
||||||
rowHeights[expandableRow]= rowHeight;
|
|
||||||
last= Math.max(last, expandableRow);
|
|
||||||
}
|
|
||||||
rowHeight= rowHeights[last];
|
|
||||||
rowHeight= rowHeight + remainder;
|
|
||||||
rowHeights[last]= rowHeight;
|
|
||||||
}
|
|
||||||
// Go through all specs in each expandable row and get the maximum specified
|
|
||||||
// heightHint. Use this as the minimumHeight for the row.
|
|
||||||
for (int i= 0; i < expandableRows.length; i++) {
|
|
||||||
int expandableRow= expandableRows[i];
|
|
||||||
int rowHeight= rowHeights[expandableRow];
|
|
||||||
int minHeight= 0;
|
|
||||||
MGridData[] row= (MGridData[]) grid.elementAt(expandableRow);
|
|
||||||
for (int j= 0; j < numColumns; j++) {
|
|
||||||
MGridData spec= row[j];
|
|
||||||
minHeight= Math.max(minHeight, spec.heightHint);
|
|
||||||
}
|
|
||||||
rowHeights[expandableRow]= Math.max(rowHeight, minHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the starting x and y.
|
|
||||||
columnX= marginWidth + composite.getBorderWidth() + composite.getClientArea().x;
|
|
||||||
rowY= marginHeight + composite.getBorderWidth() + composite.getClientArea().y;
|
|
||||||
|
|
||||||
// Layout the widget left to right, top to bottom.
|
|
||||||
for (int r= 0; r < rowSize; r++) {
|
|
||||||
int rowHeight= rowHeights[r];
|
|
||||||
MGridData[] row= (MGridData[]) grid.elementAt(r);
|
|
||||||
|
|
||||||
//
|
|
||||||
for (int c= 0; c < row.length; c++) {
|
|
||||||
int spannedWidth= 0, spannedHeight= 0;
|
|
||||||
int hAlign= 0, vAlign= 0;
|
|
||||||
int widgetX= 0, widgetY= 0;
|
|
||||||
int widgetW= 0, widgetH= 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
MGridData spec= (MGridData) row[c];
|
|
||||||
if (makeColumnsEqualWidth) {
|
|
||||||
columnWidth= composite.getBounds().width - ((marginWidth + composite.getBorderWidth()) * 2) - ((numColumns - 1) * horizontalSpacing);
|
|
||||||
columnWidth= columnWidth / numColumns;
|
|
||||||
for (int i= 0; i < columnWidths.length; i++) {
|
|
||||||
columnWidths[i]= columnWidth;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
columnWidth= columnWidths[c];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
spannedWidth= columnWidth;
|
|
||||||
for (int k= 1; k < spec.horizontalSpan; k++) {
|
|
||||||
if ((c + k) <= numColumns) {
|
|
||||||
if (!makeColumnsEqualWidth) {
|
|
||||||
columnWidth= columnWidths[c + k];
|
|
||||||
}
|
|
||||||
spannedWidth= spannedWidth + columnWidth + horizontalSpacing;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
spannedHeight= rowHeight;
|
|
||||||
for (int k= 1; k < spec.verticalSpan; k++) {
|
|
||||||
if ((r + k) <= grid.size()) {
|
|
||||||
spannedHeight= spannedHeight + rowHeights[r + k] + verticalSpacing;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (spec.isItemData()) {
|
|
||||||
Control child= children[spec.childIndex];
|
|
||||||
Point childExtent= child.computeSize(spec.widthHint, spec.heightHint, flushCache);
|
|
||||||
hAlign= spec.horizontalAlignment;
|
|
||||||
widgetX= columnX;
|
|
||||||
|
|
||||||
// Calculate the x and width values for the widget.
|
|
||||||
if (hAlign == MGridData.CENTER) {
|
|
||||||
widgetX= widgetX + (spannedWidth / 2) - (childExtent.x / 2);
|
|
||||||
} else if (hAlign == MGridData.END) {
|
|
||||||
widgetX= widgetX + spannedWidth - childExtent.x - spec.horizontalIndent;
|
|
||||||
} else {
|
|
||||||
widgetX= widgetX + spec.horizontalIndent;
|
|
||||||
}
|
|
||||||
if (hAlign == MGridData.FILL) {
|
|
||||||
widgetW= spannedWidth - spec.horizontalIndent;
|
|
||||||
widgetX= columnX + spec.horizontalIndent;
|
|
||||||
} else {
|
|
||||||
widgetW= childExtent.x;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the y and height values for the widget.
|
|
||||||
vAlign= spec.verticalAlignment;
|
|
||||||
widgetY= rowY;
|
|
||||||
if (vAlign == MGridData.CENTER) {
|
|
||||||
widgetY= widgetY + (spannedHeight / 2) - (childExtent.y / 2);
|
|
||||||
} else if (vAlign == MGridData.END) {
|
|
||||||
widgetY= widgetY + spannedHeight - childExtent.y;
|
|
||||||
} else {
|
|
||||||
//widgetY= widgetY;
|
|
||||||
}
|
|
||||||
if (vAlign == MGridData.FILL) {
|
|
||||||
widgetH= spannedHeight;
|
|
||||||
widgetY= rowY;
|
|
||||||
} else {
|
|
||||||
widgetH= childExtent.y;
|
|
||||||
}
|
|
||||||
// Place the widget.
|
|
||||||
child.setBounds(widgetX, widgetY, widgetW, widgetH);
|
|
||||||
}
|
|
||||||
// Update the starting x value.
|
|
||||||
columnX= columnX + columnWidths[c] + horizontalSpacing;
|
|
||||||
}
|
|
||||||
// Update the starting y value and since we're starting a new row, reset the starting x value.
|
|
||||||
rowY= rowY + rowHeights[r] + verticalSpacing;
|
|
||||||
columnX= marginWidth + composite.getBorderWidth() + composite.getClientArea().x;
|
|
||||||
}
|
|
||||||
//System.out.println("end layout " + id);
|
|
||||||
}
|
|
||||||
public MGridLayout() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -13,7 +13,6 @@ package org.eclipse.cdt.ui.dialogs;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.internal.ui.CPluginImages;
|
|
||||||
import org.eclipse.cdt.internal.ui.CUIMessages;
|
import org.eclipse.cdt.internal.ui.CUIMessages;
|
||||||
import org.eclipse.cdt.ui.CUIPlugin;
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -34,6 +33,8 @@ import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.Label;
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
import org.eclipse.ui.ide.IDE;
|
||||||
import org.eclipse.ui.model.WorkbenchContentProvider;
|
import org.eclipse.ui.model.WorkbenchContentProvider;
|
||||||
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
import org.eclipse.ui.model.WorkbenchLabelProvider;
|
||||||
|
|
||||||
|
@ -53,7 +54,7 @@ public class ReferenceBlock extends AbstractCOptionPage {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage() {
|
public Image getImage() {
|
||||||
return CPluginImages.get(CPluginImages.IMG_OBJS_PROJECT);
|
return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -39,7 +39,7 @@ public abstract class TabFolderOptionBlock {
|
||||||
private boolean bIsValid = true;
|
private boolean bIsValid = true;
|
||||||
|
|
||||||
private Label messageLabel;
|
private Label messageLabel;
|
||||||
private ArrayList pages;
|
private ArrayList pages = new ArrayList();
|
||||||
protected ICOptionContainer fParent;
|
protected ICOptionContainer fParent;
|
||||||
private ICOptionPage fCurrentPage;
|
private ICOptionPage fCurrentPage;
|
||||||
|
|
||||||
|
@ -66,9 +66,6 @@ public abstract class TabFolderOptionBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addOptionPage(ICOptionPage page) {
|
protected void addOptionPage(ICOptionPage page) {
|
||||||
if (pages == null) {
|
|
||||||
pages = new ArrayList();
|
|
||||||
}
|
|
||||||
if (!pages.contains(page)) {
|
if (!pages.contains(page)) {
|
||||||
pages.add(page);
|
pages.add(page);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue