46 | * The view uses a label provider to define how model objects should be 47 | * presented in the view. Each view can present the same model objects using 48 | * different labels and icons, if needed. Alternatively, a single label provider 49 | * can be shared between views in order to ensure that objects of the same type 50 | * are presented in the same way everywhere. 51 | *
52 | */ 53 | 54 | public class BookmarkView extends ViewPart { 55 | 56 | /** 57 | * The ID of the view as specified by the extension. 58 | */ 59 | public static final String ID = "bookmark.views.BookmarkView"; 60 | public static final String DATA_STORE_KEY = "bookmark_datasource"; 61 | 62 | private TreeViewer viewer; 63 | 64 | private Action addFolderAction; 65 | private Action addBookmarkAction; 66 | private Action addAllBookmarkAction; 67 | private Action deleteAction; 68 | private Action renameAction; 69 | private Action doubleClickAction; 70 | 71 | class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider { 72 | 73 | public void inputChanged(Viewer v, Object oldInput, Object newInput) { 74 | } 75 | 76 | public void dispose() { 77 | } 78 | 79 | public Object[] getElements(Object parent) { 80 | return getChildren(parent); 81 | } 82 | 83 | public Object getParent(Object child) { 84 | if (child instanceof TreeObject) { 85 | return ((TreeObject) child).getParent(); 86 | } 87 | return null; 88 | } 89 | 90 | public Object[] getChildren(Object parent) { 91 | if (parent instanceof TreeParent) { 92 | return ((TreeParent) parent).getChildren(); 93 | } 94 | return new Object[0]; 95 | } 96 | 97 | public boolean hasChildren(Object parent) { 98 | if (parent instanceof TreeParent) 99 | return ((TreeParent) parent).hasChildren(); 100 | return false; 101 | } 102 | } 103 | 104 | class ViewLabelProvider extends LabelProvider { 105 | 106 | public String getText(Object obj) { 107 | return obj.toString(); 108 | } 109 | 110 | public Image getImage(Object obj) { 111 | String imageKey = ISharedImages.IMG_OBJ_FILE; 112 | if (obj instanceof TreeParent) 113 | imageKey = ISharedImages.IMG_OBJ_FOLDER; 114 | return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey); 115 | // if need to change customize image 116 | // return new Image(null, new FileInputStream("images/file.gif")); 117 | } 118 | } 119 | 120 | class NameSorter extends ViewerSorter { 121 | } 122 | 123 | /** 124 | * The constructor. 125 | */ 126 | public BookmarkView() { 127 | } 128 | 129 | /** 130 | * This is a callback that will allow us to create the viewer and initialize 131 | * it. 132 | */ 133 | public void createPartControl(Composite parent) { 134 | viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 135 | viewer.setContentProvider(new ViewContentProvider()); 136 | viewer.setLabelProvider(new ViewLabelProvider()); 137 | viewer.setSorter(new NameSorter()); 138 | 139 | // get data from store or else do initialization 140 | TreeParent invisibleRoot = this.loadPersistantData(); 141 | 142 | // set data source 143 | viewer.setInput(invisibleRoot); 144 | 145 | // Create the help context id for the viewer's control 146 | PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "bookmark.viewer"); 147 | makeActions(); 148 | hookContextMenu(); 149 | hookDoubleClickAction(); 150 | contributeToActionBars(); 151 | } 152 | 153 | private void hookContextMenu() { 154 | MenuManager menuMgr = new MenuManager("#PopupMenu"); 155 | menuMgr.setRemoveAllWhenShown(true); 156 | menuMgr.addMenuListener(new IMenuListener() { 157 | public void menuAboutToShow(IMenuManager manager) { 158 | 159 | IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); 160 | if (!selection.isEmpty()) { 161 | TreeObject target = (TreeObject) selection.getFirstElement(); 162 | if (target instanceof TreeParent) { 163 | manager.add(addBookmarkAction); 164 | manager.add(addFolderAction); 165 | manager.add(deleteAction); 166 | manager.add(renameAction); 167 | manager.add(addAllBookmarkAction); 168 | } else { 169 | manager.add(deleteAction); 170 | } 171 | } else { 172 | manager.add(addBookmarkAction); 173 | manager.add(addFolderAction); 174 | manager.add(addAllBookmarkAction); 175 | } 176 | } 177 | }); 178 | Menu menu = menuMgr.createContextMenu(viewer.getControl()); 179 | viewer.getControl().setMenu(menu); 180 | getSite().registerContextMenu(menuMgr, viewer); 181 | } 182 | 183 | private void contributeToActionBars() { 184 | IActionBars bars = getViewSite().getActionBars(); 185 | fillLocalPullDown(bars.getMenuManager()); 186 | fillLocalToolBar(bars.getToolBarManager()); 187 | } 188 | 189 | private void fillLocalPullDown(IMenuManager manager) { 190 | 191 | } 192 | 193 | private void fillLocalToolBar(IToolBarManager manager) { 194 | manager.add(this.addBookmarkAction); 195 | manager.add(this.addFolderAction); 196 | manager.add(this.deleteAction); 197 | } 198 | 199 | @SuppressWarnings("deprecation") 200 | private void makeActions() { 201 | 202 | // remove selected folder or bookmark 203 | this.deleteAction = new Action() { 204 | public void run() { 205 | // get invisibleRoot 206 | TreeParent invisibleRoot = (TreeParent) viewer.getInput(); 207 | 208 | // get selection 209 | ISelection selection = viewer.getSelection(); 210 | Object obj = ((IStructuredSelection) selection).getFirstElement(); 211 | if (obj == null) { 212 | showMessage("No selection in Bookmark View."); 213 | } else { 214 | TreeObject target = (TreeObject) obj; 215 | // confirm dialog 216 | String title = "Confirm"; 217 | String question = "Do you really want to delelte this whole node?"; 218 | boolean answer = MessageDialog.openConfirm(null, title, question); 219 | if (answer) { 220 | invisibleRoot.removeSelectedChild(target); 221 | } 222 | // keep expand situation 223 | Object[] expandedElements = viewer.getExpandedElements(); 224 | TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); 225 | 226 | // update data source 227 | viewer.setInput(invisibleRoot); 228 | 229 | viewer.setExpandedElements(expandedElements); 230 | viewer.setExpandedTreePaths(expandedTreePaths); 231 | 232 | // save to persistent 233 | BookmarkView.savePersistantData(invisibleRoot); 234 | } 235 | } 236 | }; 237 | this.deleteAction.setText("Delete"); 238 | this.deleteAction.setToolTipText("Delete selected folder or bookmark."); 239 | this.deleteAction.setImageDescriptor( 240 | PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ETOOL_DELETE)); 241 | 242 | // use user input to add parent 243 | this.addFolderAction = new Action() { 244 | public void run() { 245 | String parentName; 246 | // create an input dialog to get user input 247 | String dialogTitle = "Input"; 248 | String dialogMessage = "Please enter folder name:"; 249 | String initialValue = ""; 250 | InputDialog dlg = new InputDialog(null, dialogTitle, dialogMessage, initialValue, 251 | ValidationUtils.getIInputValidatorInstance()); 252 | dlg.open(); 253 | if (dlg.getReturnCode() != Window.OK) { 254 | return; 255 | } else { 256 | parentName = dlg.getValue(); 257 | } 258 | 259 | // new a folder 260 | TreeParent newParent = new TreeParent(parentName); 261 | // get invisible root 262 | TreeParent invisibleRoot = (TreeParent) viewer.getInput(); 263 | 264 | // get selection 265 | ISelection selection = viewer.getSelection(); 266 | Object obj = ((IStructuredSelection) selection).getFirstElement(); 267 | if (obj == null) { 268 | // no selection, default to add to the invisibleRoot 269 | invisibleRoot.addChild(newParent); 270 | } else { 271 | invisibleRoot.addChild((TreeObject) obj, newParent); 272 | } 273 | 274 | // keep expand situation 275 | Object[] expandedElements = viewer.getExpandedElements(); 276 | TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); 277 | 278 | // update data source 279 | viewer.setInput(invisibleRoot); 280 | 281 | viewer.setExpandedElements(expandedElements); 282 | viewer.setExpandedTreePaths(expandedTreePaths); 283 | 284 | // save to persistent 285 | BookmarkView.savePersistantData(invisibleRoot); 286 | } 287 | }; 288 | this.addFolderAction.setText("Add folder here"); 289 | this.addFolderAction.setToolTipText("Add folder here"); 290 | this.addFolderAction.setImageDescriptor( 291 | PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER)); 292 | 293 | // add book mark to selected parent 294 | this.addBookmarkAction = new Action() { 295 | public void run() { 296 | // get active editor info 297 | String relativePath = ""; 298 | String projectName = ""; 299 | 300 | IWorkbench wb = PlatformUI.getWorkbench(); 301 | IWorkbenchWindow window = wb.getActiveWorkbenchWindow(); 302 | IWorkbenchPage page = window.getActivePage(); 303 | IEditorPart editor = page.getActiveEditor(); 304 | 305 | if (editor != null) { 306 | IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); 307 | IFile file = input.getFile(); 308 | relativePath = file.getProjectRelativePath().toOSString(); 309 | projectName = file.getProject().getName(); 310 | } else { 311 | // check selection from package explorer 312 | ISelectionService service = getSite().getWorkbenchWindow().getSelectionService(); 313 | IStructuredSelection packageExploerSelection = (IStructuredSelection) service 314 | .getSelection("org.eclipse.jdt.ui.PackageExplorer"); 315 | if (packageExploerSelection != null) { 316 | Object obj = packageExploerSelection.getFirstElement(); 317 | if (obj == null) { 318 | showMessage("No selection in package explorer"); 319 | return; 320 | } else { 321 | // get file info for selection from package explorer 322 | IResource resource = ((ICompilationUnit) obj).getResource(); 323 | 324 | if (resource.getType() == IResource.FILE) { 325 | IFile ifile = (IFile) resource; 326 | relativePath = ifile.getProjectRelativePath().toOSString(); 327 | projectName = ifile.getProject().getName(); 328 | } 329 | } 330 | } else { 331 | showMessage("No active editor or selection in package explorer"); 332 | return; 333 | } 334 | } 335 | 336 | // create leaf with file info 337 | TreeObject child = new TreeObject(relativePath, projectName); 338 | 339 | // get invisibleRoot 340 | TreeParent invisibleRoot = (TreeParent) viewer.getInput(); 341 | 342 | // get selection 343 | ISelection selection = viewer.getSelection(); 344 | Object obj = ((IStructuredSelection) selection).getFirstElement(); 345 | if (obj == null) { 346 | // default to insert invisibleRoot 347 | invisibleRoot.addChild(child); 348 | } else { 349 | TreeObject targetParent = (TreeObject) obj; 350 | invisibleRoot.addChild(targetParent, child); 351 | } 352 | 353 | // keep expand situation 354 | Object[] expandedElements = viewer.getExpandedElements(); 355 | TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); 356 | 357 | // update data source 358 | viewer.setInput(invisibleRoot); 359 | 360 | viewer.setExpandedElements(expandedElements); 361 | viewer.setExpandedTreePaths(expandedTreePaths); 362 | 363 | // save to persistent 364 | BookmarkView.savePersistantData(invisibleRoot); 365 | } 366 | }; 367 | this.addBookmarkAction.setText("Add bookmark here"); 368 | this.addBookmarkAction.setToolTipText("Add bookmark here"); 369 | this.addBookmarkAction.setImageDescriptor( 370 | PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_BKMRK_TSK)); 371 | 372 | addAllBookmarkAction = new Action() { 373 | public void run() { 374 | // get active editor info 375 | String relativePath = ""; 376 | String projectName = ""; 377 | 378 | IWorkbench wb = PlatformUI.getWorkbench(); 379 | IWorkbenchWindow window = wb.getActiveWorkbenchWindow(); 380 | IWorkbenchPage page = window.getActivePage(); 381 | IEditorPart[] editors = page.getEditors(); 382 | if (editors != null) { 383 | for (int i = 0; i < editors.length; i++) { 384 | IEditorPart editor = editors[i]; 385 | 386 | IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); 387 | IFile file = input.getFile(); 388 | relativePath = file.getProjectRelativePath().toOSString(); 389 | projectName = file.getProject().getName(); 390 | 391 | // create leaf with file info 392 | TreeObject child = new TreeObject(relativePath, projectName); 393 | 394 | // get invisibleRoot 395 | TreeParent invisibleRoot = (TreeParent) viewer.getInput(); 396 | 397 | // get selection 398 | ISelection selection = viewer.getSelection(); 399 | Object obj = ((IStructuredSelection) selection).getFirstElement(); 400 | if (obj == null) { 401 | // default to insert invisibleRoot 402 | invisibleRoot.addChild(child); 403 | } else { 404 | TreeObject targetParent = (TreeObject) obj; 405 | invisibleRoot.addChild(targetParent, child); 406 | } 407 | 408 | // keep expand situation 409 | Object[] expandedElements = viewer.getExpandedElements(); 410 | TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); 411 | 412 | // update data source 413 | viewer.setInput(invisibleRoot); 414 | 415 | viewer.setExpandedElements(expandedElements); 416 | viewer.setExpandedTreePaths(expandedTreePaths); 417 | 418 | // save to persistent 419 | BookmarkView.savePersistantData(invisibleRoot); 420 | } 421 | } else { 422 | showMessage("No active editor"); 423 | return; 424 | } 425 | 426 | } 427 | }; 428 | this.addAllBookmarkAction.setText("Add opened files here"); 429 | this.addAllBookmarkAction.setToolTipText("Add opened files here"); 430 | this.addAllBookmarkAction.setImageDescriptor( 431 | PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_BKMRK_TSK)); 432 | 433 | // rename the node 434 | renameAction = new Action() { 435 | public void run() { 436 | 437 | ISelection selection = viewer.getSelection(); 438 | Object obj = ((IStructuredSelection) selection).getFirstElement(); 439 | 440 | if (obj != null) { 441 | TreeObject treeObject = (TreeObject) obj; 442 | if (treeObject.flag == Constant.PARENT) { 443 | 444 | String parentName = treeObject.getName(); 445 | // create an input dialog to get user input 446 | String dialogTitle = "Input"; 447 | String dialogMessage = "Please enter folder name:"; 448 | InputDialog dlg = new InputDialog(null, dialogTitle, dialogMessage, parentName, 449 | ValidationUtils.getIInputValidatorInstance()); 450 | dlg.open(); 451 | if (dlg.getReturnCode() != Window.OK) { 452 | return; 453 | } else { 454 | parentName = dlg.getValue(); 455 | } 456 | 457 | treeObject.setName(parentName); 458 | } 459 | } 460 | 461 | TreeParent invisibleRoot = (TreeParent) viewer.getInput(); 462 | viewer.setInput(invisibleRoot); 463 | BookmarkView.savePersistantData(invisibleRoot); 464 | } 465 | }; 466 | 467 | this.renameAction.setText("Rename"); 468 | this.renameAction.setToolTipText("Rename the folder."); 469 | 470 | // double click action to open file 471 | doubleClickAction = new Action() { 472 | public void run() { 473 | ISelection selection = viewer.getSelection(); 474 | Object obj = ((IStructuredSelection) selection).getFirstElement(); 475 | 476 | if (obj != null) { 477 | TreeObject treeObject = (TreeObject) obj; 478 | if (treeObject.flag == 1) { 479 | // expand and collapse folder when double click 480 | if (viewer.getExpandedState(treeObject)) { 481 | viewer.collapseToLevel(treeObject, 1); 482 | } else { 483 | viewer.expandToLevel(treeObject, 1); 484 | } 485 | return; 486 | } 487 | String relativePath = treeObject.getName(); 488 | IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); 489 | IProject project = workspaceRoot.getProject(treeObject.getProjectName()); 490 | IFile file1 = project.getFile((new Path(relativePath))); 491 | IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 492 | IWorkbenchPage page = window.getActivePage(); 493 | IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry() 494 | .getDefaultEditor(file1.getName()); 495 | 496 | // if no right editor to find, use default text editor 497 | try { 498 | if (desc == null) { 499 | page.openEditor(new FileEditorInput(file1), "org.eclipse.ui.DefaultTextEditor"); 500 | } else { 501 | page.openEditor(new FileEditorInput(file1), desc.getId()); 502 | } 503 | } catch (PartInitException e) { 504 | e.printStackTrace(); 505 | } 506 | } 507 | } 508 | }; 509 | } 510 | 511 | private void hookDoubleClickAction() { 512 | viewer.addDoubleClickListener(new IDoubleClickListener() { 513 | public void doubleClick(DoubleClickEvent event) { 514 | doubleClickAction.run(); 515 | } 516 | }); 517 | } 518 | 519 | private void showMessage(String message) { 520 | MessageDialog.openInformation(viewer.getControl().getShell(), "Bookmark View", message); 521 | } 522 | 523 | /** 524 | * Passing the focus request to the viewer's control. 525 | */ 526 | public void setFocus() { 527 | viewer.getControl().setFocus(); 528 | } 529 | 530 | /** 531 | * Use eclipse Preferences API to make data persistent 532 | * 533 | * @param dataSource 534 | */ 535 | private static void savePersistantData(TreeParent dataSource) { 536 | Preferences prefs = InstanceScope.INSTANCE.getNode(ID); 537 | 538 | // change object to string 539 | Gson gson = new Gson(); 540 | 541 | // change object byte array 542 | ByteArrayOutputStream b = new ByteArrayOutputStream(); 543 | ObjectOutputStream o; 544 | try { 545 | o = new ObjectOutputStream(b); 546 | o.writeObject(dataSource); 547 | } catch (IOException e1) { 548 | // TODO Auto-generated catch block 549 | e1.printStackTrace(); 550 | } 551 | 552 | byte[] byteDataArray = b.toByteArray(); 553 | 554 | // use gson to change byte array to string 555 | String json_str = gson.toJson(byteDataArray); 556 | 557 | prefs.put(DATA_STORE_KEY, json_str); 558 | try { 559 | // store to disk 560 | prefs.flush(); 561 | } catch (BackingStoreException e) { 562 | e.printStackTrace(); 563 | } 564 | } 565 | 566 | private TreeParent loadPersistantData() { 567 | Preferences prefs = InstanceScope.INSTANCE.getNode(ID); 568 | 569 | String json_str = prefs.get(DATA_STORE_KEY, ""); 570 | 571 | if (json_str == "") { 572 | // no data source yet, do initialization 573 | TreeParent invisibleRoot = new TreeParent(""); 574 | return invisibleRoot; 575 | } else { 576 | Gson gson = new Gson(); 577 | byte[] byteDataArray = gson.fromJson(json_str, byte[].class); 578 | 579 | // deserialize object from byteDataArray 580 | ByteArrayInputStream b = new ByteArrayInputStream(byteDataArray); 581 | ObjectInputStream o; 582 | TreeParent invisibleRoot = null; 583 | try { 584 | o = new ObjectInputStream(b); 585 | invisibleRoot = (TreeParent) o.readObject(); 586 | } catch (IOException e) { 587 | // TODO Auto-generated catch block 588 | e.printStackTrace(); 589 | } catch (ClassNotFoundException e) { 590 | // TODO Auto-generated catch block 591 | e.printStackTrace(); 592 | } 593 | return invisibleRoot; 594 | } 595 | } 596 | } --------------------------------------------------------------------------------