187 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # coding=utf8
 | |
| import sublime
 | |
| import os
 | |
| import re
 | |
| 
 | |
| from SideBarProject import SideBarProject
 | |
| from SideBarItem import SideBarItem
 | |
| 
 | |
| class SideBarSelection:
 | |
| 
 | |
| 	def __init__(self, paths = []):
 | |
| 
 | |
| 		if len(paths) < 1:
 | |
| 			try:
 | |
| 				path = sublime.active_window().active_view().file_name()
 | |
| 				if self.isNone(path):
 | |
| 					paths = []
 | |
| 				else:
 | |
| 					paths = [path]
 | |
| 			except:
 | |
| 				paths = []
 | |
| 		self._paths = paths
 | |
| 		self._paths.sort()
 | |
| 		self._obtained_selection_information_basic = False
 | |
| 		self._obtained_selection_information_extended = False
 | |
| 
 | |
| 	def len(self):
 | |
| 		return len(self._paths)
 | |
| 
 | |
| 	def hasDirectories(self):
 | |
| 		self._obtainSelectionInformationBasic()
 | |
| 		return self._has_directories
 | |
| 
 | |
| 	def hasFiles(self):
 | |
| 		self._obtainSelectionInformationBasic()
 | |
| 		return self._has_files
 | |
| 
 | |
| 	def hasOnlyDirectories(self):
 | |
| 		self._obtainSelectionInformationBasic()
 | |
| 		return self._only_directories
 | |
| 
 | |
| 	def hasOnlyFiles(self):
 | |
| 		self._obtainSelectionInformationBasic()
 | |
| 		return self._only_files
 | |
| 
 | |
| 	def hasProjectDirectories(self):
 | |
| 		if self.hasDirectories():
 | |
| 			project_directories = SideBarProject().getDirectories()
 | |
| 			for item in self.getSelectedDirectories():
 | |
| 				if item.path() in project_directories:
 | |
| 					return True
 | |
| 			return False
 | |
| 		else:
 | |
| 			return False
 | |
| 
 | |
| 	def hasItemsUnderProject(self):
 | |
| 		for item in self.getSelectedItems():
 | |
| 			if item.isUnderCurrentProject():
 | |
| 				return True
 | |
| 		return False
 | |
| 
 | |
| 	def hasImages(self):
 | |
| 		return self.hasFilesWithExtension('gif|jpg|jpeg|png')
 | |
| 
 | |
| 	def hasFilesWithExtension(self, extensions):
 | |
| 		extensions = re.compile('('+extensions+')$', re.I);
 | |
| 		for item in self.getSelectedFiles():
 | |
| 			if extensions.search(item.path()):
 | |
| 				return True;
 | |
| 		return False
 | |
| 
 | |
| 	def getSelectedItems(self):
 | |
| 		self._obtainSelectionInformationExtended()
 | |
| 		return self._files + self._directories;
 | |
| 
 | |
| 	def getSelectedItemsWithoutChildItems(self):
 | |
| 		self._obtainSelectionInformationExtended()
 | |
| 		items = []
 | |
| 		for item in self._items_without_containing_child_items:
 | |
| 			items.append(SideBarItem(item, os.path.isdir(item)))
 | |
| 		return items
 | |
| 
 | |
| 	def getSelectedDirectories(self):
 | |
| 		self._obtainSelectionInformationExtended()
 | |
| 		return self._directories;
 | |
| 
 | |
| 	def getSelectedFiles(self):
 | |
| 		self._obtainSelectionInformationExtended()
 | |
| 		return self._files;
 | |
| 
 | |
| 	def getSelectedDirectoriesOrDirnames(self):
 | |
| 		self._obtainSelectionInformationExtended()
 | |
| 		return self._directories_or_dirnames;
 | |
| 
 | |
| 	def getSelectedImages(self):
 | |
| 		return self.getSelectedFilesWithExtension('gif|jpg|jpeg|png')
 | |
| 
 | |
| 	def getSelectedFilesWithExtension(self, extensions):
 | |
| 		items = []
 | |
| 		extensions = re.compile('('+extensions+')$', re.I);
 | |
| 		for item in self.getSelectedFiles():
 | |
| 			if extensions.search(item.path()):
 | |
| 				items.append(item)
 | |
| 		return items
 | |
| 
 | |
| 	def _obtainSelectionInformationBasic(self):
 | |
| 		if not self._obtained_selection_information_basic:
 | |
| 			self._obtained_selection_information_basic = True
 | |
| 
 | |
| 			self._has_directories = False
 | |
| 			self._has_files = False
 | |
| 			self._only_directories = False
 | |
| 			self._only_files = False
 | |
| 
 | |
| 			for path in self._paths:
 | |
| 				if self._has_directories == False and os.path.isdir(path):
 | |
| 					self._has_directories = True
 | |
| 				if self._has_files == False and os.path.isdir(path) == False:
 | |
| 					self._has_files = True
 | |
| 				if self._has_files and self._has_directories:
 | |
| 					break
 | |
| 
 | |
| 			if self._has_files and self._has_directories:
 | |
| 				self._only_directories = False
 | |
| 				self._only_files 	= False
 | |
| 			elif self._has_files:
 | |
| 				self._only_files 	= True
 | |
| 			elif self._has_directories:
 | |
| 				self._only_directories = True
 | |
| 
 | |
| 	def _obtainSelectionInformationExtended(self):
 | |
| 		if not self._obtained_selection_information_extended:
 | |
| 			self._obtained_selection_information_extended = True
 | |
| 
 | |
| 			self._directories = []
 | |
| 			self._files = []
 | |
| 			self._directories_or_dirnames = []
 | |
| 			self._items_without_containing_child_items = []
 | |
| 
 | |
| 			_directories = []
 | |
| 			_files = []
 | |
| 			_directories_or_dirnames = []
 | |
| 			_items_without_containing_child_items = []
 | |
| 
 | |
| 			for path in self._paths:
 | |
| 				if os.path.isdir(path):
 | |
| 					item = SideBarItem(path, True)
 | |
| 					if item.path() not in _directories:
 | |
| 						_directories.append(item.path())
 | |
| 						self._directories.append(item)
 | |
| 					if item.path() not in _directories_or_dirnames:
 | |
| 						_directories_or_dirnames.append(item.path())
 | |
| 						self._directories_or_dirnames.append(item)
 | |
| 					_items_without_containing_child_items = self._itemsWithoutContainingChildItems(_items_without_containing_child_items, item.path())
 | |
| 				else:
 | |
| 					item = SideBarItem(path, False)
 | |
| 					if item.path() not in _files:
 | |
| 						_files.append(item.path())
 | |
| 						self._files.append(item)
 | |
| 					_items_without_containing_child_items = self._itemsWithoutContainingChildItems(_items_without_containing_child_items, item.path())
 | |
| 					item = SideBarItem(os.path.dirname(path), True)
 | |
| 					if item.path() not in _directories_or_dirnames:
 | |
| 						_directories_or_dirnames.append(item.path())
 | |
| 						self._directories_or_dirnames.append(item)
 | |
| 
 | |
| 			self._items_without_containing_child_items = _items_without_containing_child_items
 | |
| 
 | |
| 	def _itemsWithoutContainingChildItems(self, items, item):
 | |
| 		new_list = []
 | |
| 		add = True
 | |
| 		for i in items:
 | |
| 			if i.find(item+'\\') == 0 or i.find(item+'/') == 0:
 | |
| 				continue
 | |
| 			else:
 | |
| 				new_list.append(i)
 | |
| 			if (item+'\\').find(i+'\\') == 0 or (item+'/').find(i+'/') == 0:
 | |
| 				add = False
 | |
| 		if add:
 | |
| 			new_list.append(item)
 | |
| 		return new_list
 | |
| 
 | |
| 	def isNone(self, path):
 | |
| 		if path == None or path == '' or path == '.' or path == '..' or path == './' or path == '/' or path == '//' or path == '\\' or path == '\\\\' or path == '\\\\\\\\':
 | |
| 			return True
 | |
| 		else:
 | |
| 			return False
 |