Index: META-INF/MANIFEST.MF
===================================================================
--- META-INF/MANIFEST.MF	(revision 5024)
+++ META-INF/MANIFEST.MF	(working copy)
@@ -15,6 +15,7 @@
 Export-Package: org.tigris.subversion.subclipse.core,
  org.tigris.subversion.subclipse.core.client,
  org.tigris.subversion.subclipse.core.commands,
+ org.tigris.subversion.subclipse.core.excludedfiles,
  org.tigris.subversion.subclipse.core.history,
  org.tigris.subversion.subclipse.core.internal,
  org.tigris.subversion.subclipse.core.mapping,
Index: src/org/tigris/subversion/subclipse/core/ISVNCoreConstants.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/ISVNCoreConstants.java	(revision 5024)
+++ src/org/tigris/subversion/subclipse/core/ISVNCoreConstants.java	(working copy)
@@ -18,6 +18,7 @@
     String PREF_RECURSIVE_STATUS_UPDATE = "resursive_status_update";
     String PREF_SHOW_OUT_OF_DATE_FOLDERS = "show_out_of_date_folders";
     String PREF_SHARE_NESTED_PROJECTS = "share_nested_projects";
+    String PREF_SHOW_EXCLUDED_FILES = "show_excluded_files";
     
     public final int DEPTH_EMPTY = 0;
     public final int DEPTH_FILES = 1;
Index: src/org/tigris/subversion/subclipse/core/PreferenceInitializer.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/PreferenceInitializer.java	(revision 5024)
+++ src/org/tigris/subversion/subclipse/core/PreferenceInitializer.java	(working copy)
@@ -31,6 +31,7 @@
 		preferences.setDefault(ISVNCoreConstants.PREF_RECURSIVE_STATUS_UPDATE, true);
         preferences.setDefault(ISVNCoreConstants.PREF_SHOW_OUT_OF_DATE_FOLDERS, false);
         preferences.setDefault(ISVNCoreConstants.PREF_SHARE_NESTED_PROJECTS, true);
+        preferences.setDefault(ISVNCoreConstants.PREF_SHOW_EXCLUDED_FILES, true);
     }
 
 }
Index: src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java	(revision 5024)
+++ src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java	(working copy)
@@ -604,6 +604,15 @@
 //		}
     }
     
+    public boolean isShowExcludedFiles() {
+    	return getPluginPreferences().getBoolean(ISVNCoreConstants.PREF_SHOW_EXCLUDED_FILES);    	
+    }
+
+    public void setShowExcludedFiles(boolean value) {
+    	getPluginPreferences().setValue(ISVNCoreConstants.PREF_SHOW_EXCLUDED_FILES, value);    
+    	savePluginPreferences();
+    }
+    
     public synchronized ActiveChangeSetManager getChangeSetManager() {
         if (changeSetManager == null) {
             changeSetManager = new SVNActiveChangeSetCollector(SVNWorkspaceSubscriber.getInstance());
Index: src/org/tigris/subversion/subclipse/core/excludedfiles/ExcludedFilesContentHandler.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/excludedfiles/ExcludedFilesContentHandler.java	(revision 0)
+++ src/org/tigris/subversion/subclipse/core/excludedfiles/ExcludedFilesContentHandler.java	(revision 0)
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Subclipse project and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Subclipse project committers - initial API and implementation
+ ******************************************************************************/
+package org.tigris.subversion.subclipse.core.excludedfiles;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @author sinan.yumak
+ *
+ */
+public class ExcludedFilesContentHandler extends DefaultHandler {
+
+	private StringBuffer buffer;
+	private List excludedFiles;
+	
+	public ExcludedFilesContentHandler() {
+	}
+
+	public void characters(char[] chars, int startIndex, int length) {
+		if (buffer == null) return;
+		buffer.append(chars, startIndex, length);
+	}
+
+	public void startElement(
+			String namespaceURI,
+			String localName,
+			String qName,
+			Attributes atts) {
+        String elementName = getElementName(namespaceURI, localName, qName); 		
+		
+		if (elementName.equals(ExcludedFilesManager.ELEMENT_EXCLUDED_FILE)) {
+			buffer = new StringBuffer();
+			return;
+		} 
+		if (elementName.equals(ExcludedFilesManager.ELEMENT_EXCLUDED_FILES)) {
+			excludedFiles = new ArrayList();
+			return;
+		}
+	}
+	
+	public void endElement(String namespaceURI, String localName, String qName) {
+        String elementName = getElementName(namespaceURI, localName, qName);		
+		
+		if (elementName.equals(ExcludedFilesManager.ELEMENT_EXCLUDED_FILE)) {
+			excludedFiles.add(buffer.toString());
+			buffer = null;
+			return;
+		} 
+		if (elementName.equals(ExcludedFilesManager.ELEMENT_EXCLUDED_FILES)) {
+            ExcludedFilesManager.setExcludedFiles(excludedFiles);
+			return;
+		} 
+	}
+	
+    /* 
+     * Couldn't figure out from the SAX API exactly when localName vs. qName is used. 
+     * However, the XML for project sets doesn't use namespaces so either of the two names 
+     * is fine. Therefore, use whichever one is provided. 
+     */ 
+    private String getElementName(String namespaceURI, String localName, String qName) { 
+        if (localName != null && localName.length() > 0) { 
+                return localName; 
+        } else { 
+                return qName; 
+        } 
+    } 	
+
+}
Index: src/org/tigris/subversion/subclipse/core/excludedfiles/ExcludedFilesManager.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/excludedfiles/ExcludedFilesManager.java	(revision 0)
+++ src/org/tigris/subversion/subclipse/core/excludedfiles/ExcludedFilesManager.java	(revision 0)
@@ -0,0 +1,128 @@
+package org.tigris.subversion.subclipse.core.excludedfiles;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.core.internal.resources.XMLWriter;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.team.core.TeamException;
+import org.tigris.subversion.subclipse.core.SVNException;
+import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
+import org.tigris.subversion.subclipse.core.util.File2Resource;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * @author sinan.yumak
+ *
+ */
+public class ExcludedFilesManager {
+    private static final String EXCLUDED_FILES_FILE = "excludedFiles.xml"; //$NON-NLS-1$
+    static final String ELEMENT_EXCLUDED_FILE = "ExcludedFile"; //$NON-NLS-1$
+	static final String ELEMENT_EXCLUDED_FILES = "ExcludedFiles"; //$NON-NLS-1$
+
+	private static Set excludedFiles = new HashSet();
+			
+	static {
+		loadExcludedFiles();
+	}
+	
+    public static void loadExcludedFiles() {
+    	System.out.println("Loading excluded files...");
+    	
+    	IPath pluginStateLocation = SVNProviderPlugin.getPlugin().getStateLocation().append(EXCLUDED_FILES_FILE);
+        File file = pluginStateLocation.toFile();
+        if (!file.exists()) return;
+        try {
+            BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
+            try {
+            	SAXParserFactory factory = SAXParserFactory.newInstance();
+
+                try {
+                	SAXParser parser = factory.newSAXParser();                	
+                    parser.parse(new InputSource(is), new ExcludedFilesContentHandler());
+                } catch (SAXException ex) {
+                    throw new SVNException("RepositoryManager.parsingProblem", ex); //$NON-NLS-1$
+                } catch (ParserConfigurationException e) {
+                    throw new SVNException("RepositoryManager.parsingProblem", e); //$NON-NLS-1$				
+                }
+            } finally {
+                is.close();
+            }
+        } catch (IOException e) {
+            SVNProviderPlugin.log(new Status(IStatus.ERROR, SVNProviderPlugin.ID, TeamException.UNABLE, "RepositoryManager.ioException", e)); //$NON-NLS-1$
+        } catch (TeamException e) {
+        	SVNProviderPlugin.log(e.getStatus());
+        }
+    }
+	
+    public void saveExcludedFiles() throws TeamException {
+        IPath pluginStateLocation = SVNProviderPlugin.getPlugin().getStateLocation();
+        File tempFile = pluginStateLocation.append(EXCLUDED_FILES_FILE + ".tmp").toFile(); //$NON-NLS-1$
+        File excludedFilesFile = pluginStateLocation.append(EXCLUDED_FILES_FILE).toFile();
+        try {
+             XMLWriter writer = new XMLWriter(new BufferedOutputStream(new FileOutputStream(tempFile)));
+             try {
+                 writer.startTag(ELEMENT_EXCLUDED_FILES, null, false);
+                 
+                 Iterator iterator = excludedFiles.iterator();
+                 while(iterator.hasNext()) {
+                     writer.printSimpleTag(ELEMENT_EXCLUDED_FILE, ((IResource)iterator.next()).getLocation() );
+                 }
+                 writer.endTag(ELEMENT_EXCLUDED_FILES);
+             } finally {
+                     writer.close();
+             }
+             if (excludedFilesFile.exists()) {
+            	 excludedFilesFile.delete();
+             }
+             boolean renamed = tempFile.renameTo(excludedFilesFile);
+             if (!renamed) {
+                     throw new TeamException(new Status(IStatus.ERROR, SVNProviderPlugin.ID, TeamException.UNABLE, "RepositoryManager.rename" + tempFile.getAbsolutePath(), null)); //$NON-NLS-1$
+             }
+         } catch (IOException e) {
+                 throw new TeamException(new Status(IStatus.ERROR, SVNProviderPlugin.ID, TeamException.UNABLE, "RepositoryManager.save" + excludedFilesFile.getAbsolutePath(), e)); //$NON-NLS-1$
+         }
+    }
+
+    static void setExcludedFiles(List files) {
+    	excludedFiles.clear();
+    	
+    	IResource resource = null;
+    	for (int i=0;i<files.size();i++) {
+    		resource = File2Resource.getResource((String)files.get(i));
+    		if (resource != null) {
+    			excludedFiles.add(resource);
+    		}
+    	}
+    	System.out.println("Loaded "+ excludedFiles.size() + " excluded file...");
+    }
+
+    public static Set getExcludedFiles() {
+    	return excludedFiles;
+    }
+    
+    public static void addExcludedFile(IResource resource) {
+		excludedFiles.add(resource);
+    }
+    
+    public static void removeExcludedFile(IResource resource) {
+    	excludedFiles.remove(resource);
+    }
+
+}
Index: src/org/tigris/subversion/subclipse/core/status/StatusCacheManager.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/status/StatusCacheManager.java	(revision 5024)
+++ src/org/tigris/subversion/subclipse/core/status/StatusCacheManager.java	(working copy)
@@ -27,13 +27,14 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.core.runtime.QualifiedName;
 import org.tigris.subversion.subclipse.core.ISVNCoreConstants;
 import org.tigris.subversion.subclipse.core.ISVNLocalResource;
 import org.tigris.subversion.subclipse.core.SVNException;
 import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
 import org.tigris.subversion.subclipse.core.commands.GetInfoCommand;
+import org.tigris.subversion.subclipse.core.excludedfiles.ExcludedFilesManager;
 import org.tigris.subversion.subclipse.core.resources.LocalResourceStatus;
 import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
 import org.tigris.subversion.subclipse.core.util.JobUtility;
@@ -93,9 +94,16 @@
     	final List result = new ArrayList(statuses.length);
 //    	if (ResourcesPlugin.getWorkspace().isTreeLocked())
 //    	{
-            for (int i = 0; i < statuses.length;i++) {
-            	IResource resource = SVNWorkspaceRoot.getResourceFor(parent, statuses[i]);
-            	result.add(updateCache(resource, statuses[i]));
+    		for (int i = 0; i < statuses.length;i++) {
+    			if (SVNProviderPlugin.getPlugin().isShowExcludedFiles()) {
+    				IResource resource = SVNWorkspaceRoot.getResourceFor(parent, statuses[i]);
+    				result.add(updateCache(resource, statuses[i]));
+    			} else {
+    				if (!ExcludedFilesManager.getExcludedFiles().contains(parent)) {
+    					IResource resource = SVNWorkspaceRoot.getResourceFor(parent, statuses[i]);
+    					result.add(updateCache(resource, statuses[i]));
+    				}
+    			}
             }
 //    	}
 //    	else
Index: src/org/tigris/subversion/subclipse/core/sync/SVNWorkspaceSubscriber.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/sync/SVNWorkspaceSubscriber.java	(revision 5024)
+++ src/org/tigris/subversion/subclipse/core/sync/SVNWorkspaceSubscriber.java	(working copy)
@@ -45,6 +45,7 @@
 import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
 import org.tigris.subversion.subclipse.core.SVNTeamProvider;
 import org.tigris.subversion.subclipse.core.client.StatusAndInfoCommand;
+import org.tigris.subversion.subclipse.core.excludedfiles.ExcludedFilesManager;
 import org.tigris.subversion.subclipse.core.resources.LocalResourceStatus;
 import org.tigris.subversion.subclipse.core.resources.RemoteResourceStatus;
 import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
@@ -115,6 +116,9 @@
      */
     public boolean isSupervised(IResource resource) throws TeamException {
 		try {
+	    	if ( !SVNProviderPlugin.getPlugin().isShowExcludedFiles() ) {
+	    		if (ExcludedFilesManager.getExcludedFiles().contains(resource)) return false;
+	    	}
 			if (resource.isTeamPrivateMember() || SVNWorkspaceRoot.isLinkedResource(resource)) return false;
 			RepositoryProvider provider = RepositoryProvider.getProvider(resource.getProject(), SVNProviderPlugin.getTypeId());
 			if (provider == null) return false;
Index: src/org/tigris/subversion/subclipse/core/util/File2Resource.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/util/File2Resource.java	(revision 5024)
+++ src/org/tigris/subversion/subclipse/core/util/File2Resource.java	(working copy)
@@ -66,4 +66,11 @@
         return resource;
     }
 
+    public static IResource getResource(String filePath) {
+    	if (filePath == null || filePath.length() == 0) return null;
+    	File file = new File(filePath);
+
+    	return getResource(file, file.isDirectory());
+    }
+    
 }
\ No newline at end of file

