1 4 package org.terracotta.dso.editors.tree; 5 6 import org.eclipse.core.resources.IFile; 7 import org.eclipse.core.resources.IFolder; 8 import org.eclipse.core.resources.IResource; 9 import org.eclipse.core.runtime.CoreException; 10 11 import org.terracotta.dso.TcPlugin; 12 import com.tc.admin.common.XAbstractAction; 13 14 import java.awt.Component ; 15 import java.awt.KeyboardFocusManager ; 16 import java.awt.event.ActionEvent ; 17 import java.util.ArrayList ; 18 import java.util.Vector ; 19 20 import javax.swing.JOptionPane ; 21 import javax.swing.JPopupMenu ; 22 import javax.swing.tree.TreeNode ; 23 24 30 31 public class ProjectFolderNode extends ProjectNode implements IResourceNode { 32 private IFolder m_folder; 33 private String m_extension; 34 private IResource[] m_members; 35 private JPopupMenu m_popup; 36 37 public ProjectFolderNode(IFolder folder) { 38 this(folder, null); 39 initPopup(); 40 init(); 41 } 42 43 private void initPopup() { 44 m_popup = new JPopupMenu (); 45 m_popup.add(new NewFolderAction()); 46 } 47 48 public JPopupMenu getPopupMenu() { 49 return m_popup; 50 } 51 52 public ProjectFolderNode(IFolder folder, String extension) { 53 super(folder); 54 55 m_folder = folder; 56 m_extension = extension; 57 58 init(); 59 } 60 61 private void init() { 62 int count = ensureMembers().length; 63 64 if(children == null) { 65 children = new Vector (); 66 } 67 children.setSize(count); 68 } 69 70 public TreeNode getChildAt(int index) { 71 if(children != null && children.elementAt(index) == null) { 72 addChildren(); 73 } 74 75 return super.getChildAt(index); 76 } 77 78 protected void removeChildren() { 79 removeAllChildren(); 80 nodeStructureChanged(); 81 } 82 83 protected void addChildren() { 84 IResource[] members = ensureMembers(); 85 IResource member; 86 87 for(int i = 0; i < members.length; i++) { 88 member = members[i]; 89 90 switch(member.getType()) { 91 case IResource.FOLDER: { 92 setChildAt(createFolderNode((IFolder)member, m_extension), i); 93 break; 94 } 95 case IResource.FILE: { 96 setChildAt(new ProjectFileNode((IFile)member), i); 97 break; 98 } 99 } 100 } 101 } 102 103 protected ProjectFolderNode createFolderNode(IFolder folder, String extension) { 104 return new ProjectFolderNode(folder, extension); 105 } 106 107 protected boolean addResource(IResource resource) { 108 return resource.getType() == IResource.FOLDER || 109 m_extension == null || 110 m_extension.equals(resource.getFileExtension()); 111 } 112 113 protected void refresh() { 114 removeChildren(); 115 addChildren(); 116 } 117 118 public String toString() { 119 return m_folder.getName(); 120 } 121 122 public IResource getResource() { 123 return getFolder(); 124 } 125 126 public IFolder getFolder() { 127 return m_folder; 128 } 129 130 public String getExtension() { 131 return m_extension; 132 } 133 134 class NewFolderAction extends XAbstractAction { 135 NewFolderAction() { 136 super("Create folder..."); 137 } 138 139 public void actionPerformed(ActionEvent ae) { 140 Object src = ae.getSource(); 141 KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 142 Component pfo = kfm.getPermanentFocusOwner(); 143 144 System.out.println("src: " + src); 145 146 String name = JOptionPane.showInputDialog(pfo, "Enter new folder name"); 147 148 try { 149 m_folder.getFolder(name).create(true, true, null); 150 refresh(); 151 } catch(CoreException ce) { 152 TcPlugin.getDefault().openError("Unable to create folder", ce); 153 } 154 } 155 } 156 157 private IResource[] ensureMembers() { 158 if(m_members == null) { 159 m_members = internalGetMembers(); 160 } 161 return m_members; 162 } 163 164 private IResource[] internalGetMembers() { 165 try { 166 ArrayList <IResource> list = new ArrayList <IResource>(); 167 IResource[] members = m_folder.members(); 168 169 for(int i = 0; i < members.length; i++) { 170 if(addResource(members[i])) { 171 list.add(members[i]); 172 } 173 } 174 175 return list.toArray(new IResource[0]); 176 } catch(CoreException ce) { 177 return new IResource[0]; 178 } 179 } 180 } 181 | Popular Tags |