1 11 package org.eclipse.team.internal.ccvs.ui.tags; 12 13 import java.util.ArrayList ; 14 import java.util.Arrays ; 15 import java.util.HashSet ; 16 import java.util.List ; 17 import java.util.Set ; 18 19 import org.eclipse.core.resources.IResource; 20 import org.eclipse.core.resources.mapping.ResourceMapping; 21 import org.eclipse.core.runtime.*; 22 import org.eclipse.team.core.TeamException; 23 import org.eclipse.team.internal.ccvs.core.*; 24 import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; 25 26 29 public abstract class TagSource { 30 31 34 public static final int BASE = -1; 35 36 public static final TagSource EMPTY = new TagSource() { 37 public void commit(CVSTag[] tags, boolean replace, IProgressMonitor monitor) throws CVSException { 38 } 40 public ICVSRepositoryLocation getLocation() { 41 return null; 43 } 44 public String getShortDescription() { 45 return "Empty"; } 47 public CVSTag[] getTags(int type) { 48 return new CVSTag[0]; 49 } 50 public CVSTag[] refresh(boolean bestEffort, IProgressMonitor monitor) throws TeamException { 51 return new CVSTag[0]; 52 } 53 public ICVSResource[] getCVSResources() { 54 return new ICVSResource[0]; 55 } 56 }; 57 58 private ListenerList listeners = new ListenerList(ListenerList.IDENTITY); 59 60 64 public interface ITagSourceChangeListener { 65 void tagsChanged(TagSource source); 66 } 67 68 public static int[] convertIncludeFlaqsToTagTypes(int includeFlags) { 69 List types = new ArrayList (); 70 if ((includeFlags & TagSelectionArea.INCLUDE_BRANCHES) > 0) 71 types.add(new Integer (CVSTag.BRANCH)); 72 if ((includeFlags & TagSelectionArea.INCLUDE_VERSIONS) > 0) 73 types.add(new Integer (CVSTag.VERSION)); 74 if ((includeFlags & (TagSelectionArea.INCLUDE_HEAD_TAG)) > 0) 75 types.add(new Integer (CVSTag.HEAD)); 76 if ((includeFlags & (TagSelectionArea.INCLUDE_DATES)) > 0) 77 types.add(new Integer (CVSTag.DATE)); 78 if ((includeFlags & (TagSelectionArea.INCLUDE_BASE_TAG)) > 0) 79 types.add(new Integer (BASE)); 80 int[] result = new int[types.size()]; 81 for (int i = 0; i < result.length; i++) { 82 result[i] = ((Integer )types.get(i)).intValue(); 83 84 } 85 return result; 86 } 87 88 93 public static TagSource create(ICVSFolder[] folders) { 94 if (folders.length == 1) { 95 return new SingleFolderTagSource(folders[0]); 96 } else { 97 return new MultiFolderTagSource(folders); 98 } 99 } 100 101 106 public static TagSource create(ICVSResource[] resources) { 107 if (resources.length == 1 && !resources[0].isFolder()) 108 return new SingleFileTagSource((ICVSFile)resources[0]); 109 return create(getFolders(resources)); 110 } 111 112 private static ICVSFolder[] getFolders(ICVSResource[] resources) { 113 return new ICVSFolder[] { getFirstFolder(resources) } ; 114 } 115 116 121 public static TagSource create(IResource[] resources) { 122 return create(getCVSResources(getProjects(resources))); 123 } 124 125 130 public static TagSource create(ResourceMapping[] mappers) { 131 return create(getCVSResources(getProjects(mappers))); 132 } 133 134 private static IResource[] getProjects(ResourceMapping[] mappers) { 135 Set projects = new HashSet (); 136 for (int i = 0; i < mappers.length; i++) { 137 ResourceMapping mapper = mappers[i]; 138 projects.addAll(Arrays.asList(mapper.getProjects())); 139 } 140 return (IResource[]) projects.toArray(new IResource[projects.size()]); 141 } 142 143 private static IResource[] getProjects(IResource[] resources) { 144 Set result = new HashSet (); 145 for (int i = 0; i < resources.length; i++) { 146 IResource resource = resources[i]; 147 result.add(resource.getProject()); 148 } 149 return (IResource[]) result.toArray(new IResource[result.size()]); 150 } 151 152 157 public static TagSource create(ICVSRemoteFolder remote) { 158 return new SingleFolderTagSource(remote); 159 } 160 161 private static ICVSResource[] getCVSResources(IResource[] resources) { 162 List cvsResources = new ArrayList (); 163 for (int i = 0; i < resources.length; i++) { 164 IResource resource = resources[i]; 165 cvsResources.add(CVSWorkspaceRoot.getCVSResourceFor(resource)); 166 } 167 return (ICVSResource[]) cvsResources.toArray(new ICVSResource[cvsResources.size()]); 168 } 169 170 private static ICVSFolder getFirstFolder(ICVSResource[] resources) { 171 if (resources[0].isFolder()) { 172 return (ICVSFolder)resources[0]; 173 } else { 174 return resources[0].getParent(); 175 } 176 } 177 178 public CVSTag[] getTags(int type) { 179 switch (type) { 180 case BASE: 181 return new CVSTag[] { CVSTag.BASE }; 182 case CVSTag.HEAD: 183 return new CVSTag[] { CVSTag.DEFAULT }; 184 } 185 return new CVSTag[0]; 186 } 187 188 public CVSTag[] getTags(int[] types) { 189 if (types.length == 0) { 190 return new CVSTag[0]; 191 } 192 if (types.length == 1) { 193 return getTags(types[0]); 194 } 195 List result = new ArrayList (); 196 for (int i = 0; i < types.length; i++) { 197 int type = types[i]; 198 CVSTag[] tags = getTags(type); 199 result.addAll(Arrays.asList(tags)); 200 } 201 return (CVSTag[]) result.toArray(new CVSTag[result.size()]); 202 } 203 204 210 public abstract CVSTag[] refresh(boolean bestEffort, IProgressMonitor monitor) throws TeamException; 211 212 public abstract ICVSRepositoryLocation getLocation(); 213 214 218 public abstract String getShortDescription(); 219 220 227 public abstract void commit(CVSTag[] tags, boolean replace, IProgressMonitor monitor) throws CVSException; 228 229 public void addListener(ITagSourceChangeListener listener) { 230 listeners.add(listener); 231 } 232 233 public void removeListener(ITagSourceChangeListener listener) { 234 listeners.remove(listener); 235 } 236 237 240 public void fireChange() { 241 Object [] list = listeners.getListeners(); 242 for (int i = 0; i < list.length; i++) { 243 final ITagSourceChangeListener listener = (ITagSourceChangeListener)list[i]; 244 Platform.run(new ISafeRunnable() { 245 public void handleException(Throwable exception) { 246 } 248 public void run() throws Exception { 249 listener.tagsChanged(TagSource.this); 250 } 251 }); 252 } 253 } 254 255 public abstract ICVSResource[] getCVSResources(); 256 } 257 | Popular Tags |