- Timestamp:
- 2003-05-27T15:40:47+12:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gli/src/org/greenstone/gatherer/util/DragTreeSelectionModel.java
r4293 r4364 45 45 46 46 public class DragTreeSelectionModel 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 47 extends DefaultTreeSelectionModel 48 implements MouseListener { 49 50 boolean immediate = false; 51 52 private int type = -1; 53 54 private String suffix = null; 55 56 private TreePath temp_path = null; 57 private TreePath temp_paths[] = null; 58 59 static private final int NONE = -1; 60 static private final int ADD = 0; 61 static private final int SET = 1; 62 63 public DragTreeSelectionModel(DragTree tree) { 64 super(); 65 setSelectionMode(DISCONTIGUOUS_TREE_SELECTION); 66 tree.addMouseListener(this); 67 } 68 69 public void addSelectionPath(TreePath path) { 70 if(!immediate) { 71 this.temp_path = path; 72 this.type = this.ADD; 73 } 74 else if(isAppropriate(path)) { 75 temp_path = null; 76 super.addSelectionPath(path); 77 suffix = null; 78 } 79 } 80 81 public void addSelectionPaths(TreePath paths[]) { 82 if(!immediate) { 83 this.temp_paths = paths; 84 this.type = this.ADD; 85 } 86 else if(isAppropriate(paths, true)) { 87 temp_paths = null; 88 super.setSelectionPaths(paths); 89 suffix = null; 90 } 91 } 92 93 public String getDetails() { 94 if(suffix == null) { 95 int file_count = 0; 96 int folder_count = 0; 97 for(int i = 0; selection != null && i < selection.length; i++) { 98 TreeNode node = (TreeNode) selection[i].getLastPathComponent(); 99 if(node.isLeaf()) { 100 file_count++; 101 } 102 else { 103 folder_count++; 104 } 105 } 106 106 // Update the metaaudit_suffix 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 107 String args[] = null; 108 if(file_count > 0 && folder_count > 0) { 109 if(file_count > 1 && folder_count > 1) { 110 args = new String[2]; 111 args[0] = String.valueOf(file_count); 112 args[1] = String.valueOf(folder_count); 113 suffix = Gatherer.dictionary.get("FileActions.Selected", args); 114 } 115 else if(file_count > 1) { 116 args = new String[1]; 117 args[0] = String.valueOf(file_count); 118 suffix = Gatherer.dictionary.get("FileActions.Files_And_Directory_Selected", args); 119 } 120 else if(folder_count > 1) { 121 args = new String[1]; 122 args[0] = String.valueOf(folder_count); 123 suffix = Gatherer.dictionary.get("FileActions.File_And_Directories_Selected", args); 124 } 125 else { 126 suffix = Gatherer.dictionary.get("FileActions.File_And_Directory_Selected"); 127 } 128 } 129 else if(file_count > 0) { 130 if(file_count > 1) { 131 args = new String[1]; 132 args[0] = String.valueOf(file_count); 133 suffix = Gatherer.dictionary.get("FileActions.Files_Selected", args); 134 } 135 else if(file_count == 1) { 136 suffix = Gatherer.dictionary.get("FileActions.File_Selected"); 137 } 138 } 139 else if(folder_count > 0) { 140 if(folder_count > 1) { 141 args = new String[1]; 142 args[0] = String.valueOf(folder_count); 143 suffix = Gatherer.dictionary.get("FileActions.Directories_Selected", args); 144 } 145 else { 146 suffix = Gatherer.dictionary.get("FileActions.Directory_Selected"); 147 } 148 } 149 else { 150 Gatherer.dictionary.get("FileActions.No_Selection"); 151 } 152 args = null; 153 } 154 return suffix; 155 } 156 157 /** Any implementation of MouseListener must include this method so 158 * we can be informed when the mouse is clicked. 159 * @param event A MouseEvent containing all the information about 160 * this mouse click. 161 */ 162 public void mouseClicked(MouseEvent event) { 163 } 164 165 /** Any implementation of MouseListener must include this method so 166 * we can be informed when the mouse enters a component. 167 * @param event A MouseEvent containing all the information about 168 * this mouse action. 169 */ 170 public void mouseEntered(MouseEvent event) { 171 } 172 173 /** Any implementation of MouseListener must include this method so 174 * we can be informed when the mouse exits a component. 175 * @param event A MouseEvent containing all the information about 176 * this mouse action. 177 */ 178 public void mouseExited(MouseEvent event) { 179 } 180 181 /** Any implementation of MouseListener must include this method so 182 * we can be informed when the mouse is pressed (start of click). 183 * @param event A MouseEvent containing all the information about 184 * this mouse action. 185 */ 186 public void mousePressed(MouseEvent event) { 187 } 188 189 /** Any implementation of MouseListener must include this method so 190 * we can be informed when the mouse is released (end of click). 191 * @param event A MouseEvent containing all the information about 192 * this mouse action. 193 */ 194 public void mouseReleased(MouseEvent event) { 195 switch(this.type) { 196 case 0: // this.ADD 197 if(this.temp_path != null && isAppropriate(temp_path)) { 198 super.addSelectionPath(this.temp_path); 199 this.temp_path = null; 200 } 201 if(this.temp_paths != null && isAppropriate(temp_paths, true)) { 202 super.addSelectionPaths(this.temp_paths); 203 this.temp_paths = null; 204 } 205 this.type = this.NONE; 206 suffix = null; 207 break; 208 case 1: // this.SET 209 if(this.temp_path != null) { 210 super.setSelectionPath(this.temp_path); 211 this.temp_path = null; 212 } 213 if(this.temp_paths != null && isAppropriate(temp_paths, false)) { 214 super.setSelectionPaths(this.temp_paths); 215 this.temp_paths = null; 216 } 217 this.type = this.NONE; 218 suffix = null; 219 break; 220 } 221 } 222 223 public void setImmediate(boolean value) { 224 immediate = value; 225 } 226 227 public void setSelectionPath(TreePath path) { 228 // Since this is only a single path we don't need to check whether its an appropriate selection. 229 if(!immediate) { 230 this.temp_path = path; 231 this.type = this.SET; 232 } 233 else { 234 temp_path = null; 235 super.setSelectionPath(path); 236 suffix = null; 237 } 238 } 239 240 public void setSelectionPaths(TreePath paths[]) { 241 if(!immediate) { 242 this.temp_paths = paths; 243 this.type = this.SET; 244 } 245 else if(isAppropriate(paths, false)) { 246 temp_paths = null; 247 super.setSelectionPaths(paths); 248 suffix = null; 249 } 250 } 251 252 /** Ensure that the given path is appropriate to add to the current selection, preventing mixed selections of files and folder. We also must check that no path is a ancestor/descendant of another. There is also a slight optimization in that if the current selection contains only files (which if the rules are followed, and the first 'test' node is a file, then it must) there is no point in checking the remaining files in the selection. Its a different story for folders however as we have to ensure no folder is in the lineage of another, even if they are all folders! */ 253 private boolean isAppropriate(TreePath path) { 254 boolean appropriate = true; 255 TreeNode new_node = (TreeNode) path.getLastPathComponent(); 256 if(selection != null && selection.length > 0) { 257 TreeNode test_node = (TreeNode) selection[0].getLastPathComponent(); 258 appropriate = appropriate && (new_node.isLeaf() == test_node.isLeaf()); 259 if(!test_node.isLeaf()) { 260 appropriate = appropriate && !path.isDescendant(selection[0]) && !selection[0].isDescendant(path); 261 for(int i = 1; appropriate && selection != null && i < selection.length; i++) { 262 TreeNode current_node = (TreeNode) selection[i].getLastPathComponent(); 263 appropriate = appropriate && (new_node.isLeaf() == current_node.isLeaf()); 264 appropriate = appropriate && !path.isDescendant(selection[i]) && !selection[i].isDescendant(path); 265 } 266 } 267 } 268 return appropriate; 269 } 270 /** Ensure that the given paths are appropriate to add to the current selection, preventing mixed selections of files and folder. We also must check that no path is a ancestor/descendant of another. One last detail to keep in mind is that adding selections depends upon the current selection, whereas set the selection paths doesn't (replaces them instead) and thus no check of the current paths is needed. */ 271 private boolean isAppropriate(TreePath[] paths, boolean check_current) { 272 boolean appropriate = true; 273 if(paths != null) { 274 if(paths.length >= 2) { 275 // Prevent folders being added to a previous selection of files and vice-versa 276 // First check that the new selection are all of the same type 277 for(int i = 0; appropriate && paths != null && i < paths.length - 1; i++) { 278 TreeNode one_node = (TreeNode) paths[i].getLastPathComponent(); 279 TreeNode other_node = (TreeNode) paths[i+1].getLastPathComponent(); 280 appropriate = appropriate && (one_node.isLeaf() == other_node.isLeaf()); 281 appropriate = appropriate && !paths[i].isDescendant(paths[i+1]) && !paths[i+1].isDescendant(paths[i]); 282 } 283 } 284 284 // Now we check the current selection against the first node in our new selection 285 286 287 288 289 290 285 if(appropriate && check_current) { 286 appropriate = isAppropriate(paths[0]); 287 } 288 } 289 return appropriate; 290 } 291 291 } 292
Note:
See TracChangeset
for help on using the changeset viewer.