diff --git a/resources/detail.png b/resources/detail.png new file mode 100644 index 0000000..ad542f3 Binary files /dev/null and b/resources/detail.png differ diff --git a/resources/overview.png b/resources/overview.png new file mode 100644 index 0000000..9eb554f Binary files /dev/null and b/resources/overview.png differ diff --git a/src/bookmark/constant/Constant.java b/src/bookmark/constant/Constant.java index 4ba091e..55923b2 100644 --- a/src/bookmark/constant/Constant.java +++ b/src/bookmark/constant/Constant.java @@ -5,4 +5,7 @@ public class Constant { public static final int PARENT = 1; public static final int CHILD = 0; + public static final String ID = "bookmark.views.BookmarkView"; + public static final String DATA_STORE_KEY = "bookmark_datasource"; + } diff --git a/src/bookmark/utils/PathController.java b/src/bookmark/utils/PathController.java new file mode 100644 index 0000000..73a6a6d --- /dev/null +++ b/src/bookmark/utils/PathController.java @@ -0,0 +1,41 @@ +package bookmark.utils; + +import java.io.File; + +public class PathController { + + public static String conversion(String path) { + String ret = path; + String separatore = File.separator; + String sepAlfa = "/"; + String sepBeta = "\\"; + if (path.lastIndexOf(sepAlfa) != -1 || path.lastIndexOf(sepBeta) != -1) { + if (path.lastIndexOf(separatore) == -1) { + // devo switchare + if (separatore.equals(sepAlfa)) { + ret = path.replace(sepBeta, sepAlfa); + } else if (separatore.equals(sepBeta)) { + ret = path.replace(sepAlfa, sepBeta); + } + } + } + return ret; + } + + public static boolean check(String path) { + boolean ret = false; + String sepCheck = ""; + String sepAlfa = "/"; + String sepBeta = "\\"; + if (!File.separator.equals(sepAlfa)) { + sepCheck = sepAlfa; + } else if (!File.separator.equals(sepBeta)) { + sepCheck = sepBeta; + } + if (!sepCheck.equals("") && path.lastIndexOf(sepCheck) != -1) { + ret = true; + } + return ret; + } + +} diff --git a/src/bookmark/views/BookmarkView.java b/src/bookmark/views/BookmarkView.java index b28142b..4a40232 100644 --- a/src/bookmark/views/BookmarkView.java +++ b/src/bookmark/views/BookmarkView.java @@ -1,64 +1,52 @@ package bookmark.views; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.part.*; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.graphics.Image; -import org.eclipse.jface.action.*; -import org.eclipse.jface.dialogs.InputDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.ui.*; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.SWT; -import org.eclipse.core.runtime.Path; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.ui.part.FileEditorInput; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.osgi.service.prefs.BackingStoreException; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; import org.osgi.service.prefs.Preferences; import com.google.gson.Gson; import bookmark.constant.Constant; -import bookmark.utils.ValidationUtils; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -import org.eclipse.jdt.core.ICompilationUnit; +import bookmark.views.action.AddAllBookmarkAction; +import bookmark.views.action.AddBookmarkAction; +import bookmark.views.action.AddFolderAction; +import bookmark.views.action.CutAction; +import bookmark.views.action.DeleteAction; +import bookmark.views.action.DoubleClickAction; +import bookmark.views.action.PasteAction; +import bookmark.views.action.RenameAction; +import bookmark.views.viewer.NameSorter; +import bookmark.views.viewer.ViewContentProvider; +import bookmark.views.viewer.ViewLabelProvider; /** - * This sample class demonstrates how to plug-in a new workbench view. The view - * shows data obtained from the model. The sample creates a dummy model on the - * fly, but a real implementation would connect to the model available either in - * this or another plug-in (e.g. the workspace). The view is connected to the - * model using a content provider. + * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The sample creates a dummy model on the fly, but a real implementation would connect + * to the model available either in this or another plug-in (e.g. the workspace). The view is connected to the model using a content provider. *

- * The view uses a label provider to define how model objects should be - * presented in the view. Each view can present the same model objects using - * different labels and icons, if needed. Alternatively, a single label provider - * can be shared between views in order to ensure that objects of the same type - * are presented in the same way everywhere. + * The view uses a label provider to define how model objects should be presented in the view. Each view can present the same model objects using different labels and icons, if needed. Alternatively, + * a single label provider can be shared between views in order to ensure that objects of the same type are presented in the same way everywhere. *

*/ - public class BookmarkView extends ViewPart { - /** - * The ID of the view as specified by the extension. - */ - public static final String ID = "bookmark.views.BookmarkView"; - public static final String DATA_STORE_KEY = "bookmark_datasource"; - private TreeViewer viewer; private Action addFolderAction; @@ -68,57 +56,10 @@ public class BookmarkView extends ViewPart { private Action renameAction; private Action doubleClickAction; - class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider { - - public void inputChanged(Viewer v, Object oldInput, Object newInput) { - } - - public void dispose() { - } + private Action cutAction; + private Action pasteAction; + private Mark marker; - public Object[] getElements(Object parent) { - return getChildren(parent); - } - - public Object getParent(Object child) { - if (child instanceof TreeObject) { - return ((TreeObject) child).getParent(); - } - return null; - } - - public Object[] getChildren(Object parent) { - if (parent instanceof TreeParent) { - return ((TreeParent) parent).getChildren(); - } - return new Object[0]; - } - - public boolean hasChildren(Object parent) { - if (parent instanceof TreeParent) - return ((TreeParent) parent).hasChildren(); - return false; - } - } - - class ViewLabelProvider extends LabelProvider { - - public String getText(Object obj) { - return obj.toString(); - } - - public Image getImage(Object obj) { - String imageKey = ISharedImages.IMG_OBJ_FILE; - if (obj instanceof TreeParent) - imageKey = ISharedImages.IMG_OBJ_FOLDER; - return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey); - // if need to change customize image - // return new Image(null, new FileInputStream("images/file.gif")); - } - } - - class NameSorter extends ViewerSorter { - } /** * The constructor. @@ -127,8 +68,7 @@ public BookmarkView() { } /** - * This is a callback that will allow us to create the viewer and initialize - * it. + * This is a callback that will allow us to create the viewer and initialize it. */ public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); @@ -144,10 +84,61 @@ public void createPartControl(Composite parent) { // Create the help context id for the viewer's control PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "bookmark.viewer"); - makeActions(); - hookContextMenu(); - hookDoubleClickAction(); - contributeToActionBars(); + this.makeActions(); + this.hookContextMenu(); + this.hookDoubleClickAction(); + this.contributeToActionBars(); + } + + /** + * Passing the focus request to the viewer's control. + */ + public void setFocus() { + viewer.getControl().setFocus(); + } + + private TreeParent loadPersistantData() { + Preferences prefs = InstanceScope.INSTANCE.getNode(Constant.ID); + + String json_str = prefs.get(Constant.DATA_STORE_KEY, ""); + + if (json_str == "") { + // no data source yet, do initialization + TreeParent invisibleRoot = new TreeParent(""); + return invisibleRoot; + } else { + Gson gson = new Gson(); + byte[] byteDataArray = gson.fromJson(json_str, byte[].class); + + // deserialize object from byteDataArray + ByteArrayInputStream b = new ByteArrayInputStream(byteDataArray); + ObjectInputStream o; + TreeParent invisibleRoot = null; + try { + o = new ObjectInputStream(b); + invisibleRoot = (TreeParent) o.readObject(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return invisibleRoot; + } + } + + @SuppressWarnings("deprecation") + private void makeActions() { + this.addFolderAction = new AddFolderAction(viewer); + this.addBookmarkAction = new AddBookmarkAction(viewer, getSite().getWorkbenchWindow().getSelectionService()); + this.addAllBookmarkAction = new AddAllBookmarkAction(viewer); + this.deleteAction = new DeleteAction(viewer); + this.renameAction = new RenameAction(viewer); + this.doubleClickAction = new DoubleClickAction(viewer); + this.marker = new Mark(); + this.cutAction = new CutAction(viewer, marker); + this.pasteAction = new PasteAction(viewer, marker); } private void hookContextMenu() { @@ -165,6 +156,9 @@ public void menuAboutToShow(IMenuManager manager) { manager.add(deleteAction); manager.add(renameAction); manager.add(addAllBookmarkAction); + + manager.add(cutAction); + manager.add(pasteAction); } else { manager.add(deleteAction); } @@ -172,6 +166,9 @@ public void menuAboutToShow(IMenuManager manager) { manager.add(addBookmarkAction); manager.add(addFolderAction); manager.add(addAllBookmarkAction); + + manager.add(cutAction); + manager.add(pasteAction); } } }); @@ -180,6 +177,14 @@ public void menuAboutToShow(IMenuManager manager) { getSite().registerContextMenu(menuMgr, viewer); } + private void hookDoubleClickAction() { + viewer.addDoubleClickListener(new IDoubleClickListener() { + public void doubleClick(DoubleClickEvent event) { + doubleClickAction.run(); + } + }); + } + private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); @@ -194,403 +199,9 @@ private void fillLocalToolBar(IToolBarManager manager) { manager.add(this.addBookmarkAction); manager.add(this.addFolderAction); manager.add(this.deleteAction); + + manager.add(this.cutAction); + manager.add(this.pasteAction); } - @SuppressWarnings("deprecation") - private void makeActions() { - - // remove selected folder or bookmark - this.deleteAction = new Action() { - public void run() { - // get invisibleRoot - TreeParent invisibleRoot = (TreeParent) viewer.getInput(); - - // get selection - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - if (obj == null) { - showMessage("No selection in Bookmark View."); - } else { - TreeObject target = (TreeObject) obj; - // confirm dialog - String title = "Confirm"; - String question = "Do you really want to delelte this whole node?"; - boolean answer = MessageDialog.openConfirm(null, title, question); - if (answer) { - invisibleRoot.removeSelectedChild(target); - } - // keep expand situation - Object[] expandedElements = viewer.getExpandedElements(); - TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); - - // update data source - viewer.setInput(invisibleRoot); - - viewer.setExpandedElements(expandedElements); - viewer.setExpandedTreePaths(expandedTreePaths); - - // save to persistent - BookmarkView.savePersistantData(invisibleRoot); - } - } - }; - this.deleteAction.setText("Delete"); - this.deleteAction.setToolTipText("Delete selected folder or bookmark."); - this.deleteAction.setImageDescriptor( - PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ETOOL_DELETE)); - - // use user input to add parent - this.addFolderAction = new Action() { - public void run() { - String parentName; - // create an input dialog to get user input - String dialogTitle = "Input"; - String dialogMessage = "Please enter folder name:"; - String initialValue = ""; - InputDialog dlg = new InputDialog(null, dialogTitle, dialogMessage, initialValue, - ValidationUtils.getIInputValidatorInstance()); - dlg.open(); - if (dlg.getReturnCode() != Window.OK) { - return; - } else { - parentName = dlg.getValue(); - } - - // new a folder - TreeParent newParent = new TreeParent(parentName); - // get invisible root - TreeParent invisibleRoot = (TreeParent) viewer.getInput(); - - // get selection - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - if (obj == null) { - // no selection, default to add to the invisibleRoot - invisibleRoot.addChild(newParent); - } else { - invisibleRoot.addChild((TreeObject) obj, newParent); - } - - // keep expand situation - Object[] expandedElements = viewer.getExpandedElements(); - TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); - - // update data source - viewer.setInput(invisibleRoot); - - viewer.setExpandedElements(expandedElements); - viewer.setExpandedTreePaths(expandedTreePaths); - - // save to persistent - BookmarkView.savePersistantData(invisibleRoot); - } - }; - this.addFolderAction.setText("Add folder here"); - this.addFolderAction.setToolTipText("Add folder here"); - this.addFolderAction.setImageDescriptor( - PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER)); - - // add book mark to selected parent - this.addBookmarkAction = new Action() { - public void run() { - // get active editor info - String relativePath = ""; - String projectName = ""; - - IWorkbench wb = PlatformUI.getWorkbench(); - IWorkbenchWindow window = wb.getActiveWorkbenchWindow(); - IWorkbenchPage page = window.getActivePage(); - IEditorPart editor = page.getActiveEditor(); - - if (editor != null) { - IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); - IFile file = input.getFile(); - relativePath = file.getProjectRelativePath().toOSString(); - projectName = file.getProject().getName(); - } else { - // check selection from package explorer - ISelectionService service = getSite().getWorkbenchWindow().getSelectionService(); - IStructuredSelection packageExploerSelection = (IStructuredSelection) service - .getSelection("org.eclipse.jdt.ui.PackageExplorer"); - if (packageExploerSelection != null) { - Object obj = packageExploerSelection.getFirstElement(); - if (obj == null) { - showMessage("No selection in package explorer"); - return; - } else { - // get file info for selection from package explorer - IResource resource = ((ICompilationUnit) obj).getResource(); - - if (resource.getType() == IResource.FILE) { - IFile ifile = (IFile) resource; - relativePath = ifile.getProjectRelativePath().toOSString(); - projectName = ifile.getProject().getName(); - } - } - } else { - showMessage("No active editor or selection in package explorer"); - return; - } - } - - // create leaf with file info - TreeObject child = new TreeObject(relativePath, projectName); - - // get invisibleRoot - TreeParent invisibleRoot = (TreeParent) viewer.getInput(); - - // get selection - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - if (obj == null) { - // default to insert invisibleRoot - invisibleRoot.addChild(child); - } else { - TreeObject targetParent = (TreeObject) obj; - invisibleRoot.addChild(targetParent, child); - } - - // keep expand situation - Object[] expandedElements = viewer.getExpandedElements(); - TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); - - // update data source - viewer.setInput(invisibleRoot); - - viewer.setExpandedElements(expandedElements); - viewer.setExpandedTreePaths(expandedTreePaths); - - // save to persistent - BookmarkView.savePersistantData(invisibleRoot); - } - }; - this.addBookmarkAction.setText("Add bookmark here"); - this.addBookmarkAction.setToolTipText("Add bookmark here"); - this.addBookmarkAction.setImageDescriptor( - PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_BKMRK_TSK)); - - addAllBookmarkAction = new Action() { - public void run() { - // get active editor info - String relativePath = ""; - String projectName = ""; - - IWorkbench wb = PlatformUI.getWorkbench(); - IWorkbenchWindow window = wb.getActiveWorkbenchWindow(); - IWorkbenchPage page = window.getActivePage(); - IEditorPart[] editors = page.getEditors(); - if (editors != null) { - for (int i = 0; i < editors.length; i++) { - IEditorPart editor = editors[i]; - - IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); - IFile file = input.getFile(); - relativePath = file.getProjectRelativePath().toOSString(); - projectName = file.getProject().getName(); - - // create leaf with file info - TreeObject child = new TreeObject(relativePath, projectName); - - // get invisibleRoot - TreeParent invisibleRoot = (TreeParent) viewer.getInput(); - - // get selection - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - if (obj == null) { - // default to insert invisibleRoot - invisibleRoot.addChild(child); - } else { - TreeObject targetParent = (TreeObject) obj; - invisibleRoot.addChild(targetParent, child); - } - - // keep expand situation - Object[] expandedElements = viewer.getExpandedElements(); - TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); - - // update data source - viewer.setInput(invisibleRoot); - - viewer.setExpandedElements(expandedElements); - viewer.setExpandedTreePaths(expandedTreePaths); - - // save to persistent - BookmarkView.savePersistantData(invisibleRoot); - } - } else { - showMessage("No active editor"); - return; - } - - } - }; - this.addAllBookmarkAction.setText("Add opened files here"); - this.addAllBookmarkAction.setToolTipText("Add opened files here"); - this.addAllBookmarkAction.setImageDescriptor( - PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_BKMRK_TSK)); - - // rename the node - renameAction = new Action() { - public void run() { - - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - - if (obj != null) { - TreeObject treeObject = (TreeObject) obj; - if (treeObject.flag == Constant.PARENT) { - - String parentName = treeObject.getName(); - // create an input dialog to get user input - String dialogTitle = "Input"; - String dialogMessage = "Please enter folder name:"; - InputDialog dlg = new InputDialog(null, dialogTitle, dialogMessage, parentName, - ValidationUtils.getIInputValidatorInstance()); - dlg.open(); - if (dlg.getReturnCode() != Window.OK) { - return; - } else { - parentName = dlg.getValue(); - } - - treeObject.setName(parentName); - } - } - - TreeParent invisibleRoot = (TreeParent) viewer.getInput(); - viewer.setInput(invisibleRoot); - BookmarkView.savePersistantData(invisibleRoot); - } - }; - - this.renameAction.setText("Rename"); - this.renameAction.setToolTipText("Rename the folder."); - - // double click action to open file - doubleClickAction = new Action() { - public void run() { - ISelection selection = viewer.getSelection(); - Object obj = ((IStructuredSelection) selection).getFirstElement(); - - if (obj != null) { - TreeObject treeObject = (TreeObject) obj; - if (treeObject.flag == 1) { - // expand and collapse folder when double click - if (viewer.getExpandedState(treeObject)) { - viewer.collapseToLevel(treeObject, 1); - } else { - viewer.expandToLevel(treeObject, 1); - } - return; - } - String relativePath = treeObject.getName(); - IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); - IProject project = workspaceRoot.getProject(treeObject.getProjectName()); - IFile file1 = project.getFile((new Path(relativePath))); - IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - IWorkbenchPage page = window.getActivePage(); - IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry() - .getDefaultEditor(file1.getName()); - - // if no right editor to find, use default text editor - try { - if (desc == null) { - page.openEditor(new FileEditorInput(file1), "org.eclipse.ui.DefaultTextEditor"); - } else { - page.openEditor(new FileEditorInput(file1), desc.getId()); - } - } catch (PartInitException e) { - e.printStackTrace(); - } - } - } - }; - } - - private void hookDoubleClickAction() { - viewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - doubleClickAction.run(); - } - }); - } - - private void showMessage(String message) { - MessageDialog.openInformation(viewer.getControl().getShell(), "Bookmark View", message); - } - - /** - * Passing the focus request to the viewer's control. - */ - public void setFocus() { - viewer.getControl().setFocus(); - } - - /** - * Use eclipse Preferences API to make data persistent - * - * @param dataSource - */ - private static void savePersistantData(TreeParent dataSource) { - Preferences prefs = InstanceScope.INSTANCE.getNode(ID); - - // change object to string - Gson gson = new Gson(); - - // change object byte array - ByteArrayOutputStream b = new ByteArrayOutputStream(); - ObjectOutputStream o; - try { - o = new ObjectOutputStream(b); - o.writeObject(dataSource); - } catch (IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - - byte[] byteDataArray = b.toByteArray(); - - // use gson to change byte array to string - String json_str = gson.toJson(byteDataArray); - - prefs.put(DATA_STORE_KEY, json_str); - try { - // store to disk - prefs.flush(); - } catch (BackingStoreException e) { - e.printStackTrace(); - } - } - - private TreeParent loadPersistantData() { - Preferences prefs = InstanceScope.INSTANCE.getNode(ID); - - String json_str = prefs.get(DATA_STORE_KEY, ""); - - if (json_str == "") { - // no data source yet, do initialization - TreeParent invisibleRoot = new TreeParent(""); - return invisibleRoot; - } else { - Gson gson = new Gson(); - byte[] byteDataArray = gson.fromJson(json_str, byte[].class); - - // deserialize object from byteDataArray - ByteArrayInputStream b = new ByteArrayInputStream(byteDataArray); - ObjectInputStream o; - TreeParent invisibleRoot = null; - try { - o = new ObjectInputStream(b); - invisibleRoot = (TreeParent) o.readObject(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return invisibleRoot; - } - } } \ No newline at end of file diff --git a/src/bookmark/views/Mark.java b/src/bookmark/views/Mark.java new file mode 100644 index 0000000..27d3935 --- /dev/null +++ b/src/bookmark/views/Mark.java @@ -0,0 +1,29 @@ +package bookmark.views; + +public class Mark { + + private TreeObject node; + private Boolean mode; + + public TreeObject getNode() { + return node; + } + + public void setNode(TreeObject node) { + this.node = node; + } + + public Boolean getMode() { + return mode; + } + + public void setMode(Boolean mode) { + this.mode = mode; + } + + public void resetMark() { + this.node = null; + this.mode = null; + } + +} \ No newline at end of file diff --git a/src/bookmark/views/TreeObject.java b/src/bookmark/views/TreeObject.java index 8c81d46..9d2eab0 100644 --- a/src/bookmark/views/TreeObject.java +++ b/src/bookmark/views/TreeObject.java @@ -17,9 +17,10 @@ */ public class TreeObject implements IAdaptable, Serializable { private static final long serialVersionUID = -4275221961856278045L; - private String name; + private TreeParent parent; - protected int flag; + private String name; + private int flag; private String projectName; public TreeObject(String name) { @@ -42,6 +43,14 @@ public void setName(String name) { this.name = name; } + public int getFlag() { + return flag; + } + + public void setFlag(int flag) { + this.flag = flag; + } + public String getProjectName() { return this.projectName; } @@ -55,7 +64,13 @@ public TreeParent getParent() { } public String toString() { - return getName(); + StringBuffer sb = new StringBuffer(); + if (!getProjectName().isEmpty()) { + sb.append(getProjectName()); + sb.append(" > "); + } + sb.append(getName()); + return sb.toString(); } /** diff --git a/src/bookmark/views/TreeParent.java b/src/bookmark/views/TreeParent.java index 1b2972f..b4de25b 100644 --- a/src/bookmark/views/TreeParent.java +++ b/src/bookmark/views/TreeParent.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import bookmark.constant.Constant; +import bookmark.utils.PathController; /* * The content provider class is responsible for @@ -23,13 +24,28 @@ public class TreeParent extends TreeObject { public TreeParent(String name) { super(name); - this.flag = Constant.PARENT; + this.setFlag(Constant.PARENT); children = new ArrayList(); } public void addChild(TreeObject child) { - children.add(child); - child.setParent(this); + boolean absent = true; + for (TreeObject elem : children) { + if ( + ( + elem.getName().equals(child.getName()) + || PathController.conversion(elem.getName()).equals(child.getName()) + ) + && elem.getProjectName().equals(child.getProjectName()) + ) { + absent = false; + break; + } + } + if (absent) { + children.add(child); + child.setParent(this); + } } public void removeChild(TreeObject child) { @@ -52,8 +68,7 @@ public boolean hasChildren() { /** * Add child to specified target node * - * Use recursion way to add child, if child is leaf, to find his parent and - * add to its parent + * Use recursion way to add child, if child is leaf, to find his parent and add to its parent * * @param obj * @param path @@ -61,7 +76,7 @@ public boolean hasChildren() { public boolean addChild(TreeObject target, TreeObject child) { TreeObject[] children = this.getChildren(); for (int i = 0; i < children.length; i++) { - if (children[i].flag == Constant.PARENT) { + if (children[i].getFlag() == Constant.PARENT) { // if target is folder if (target == children[i]) { // insert child @@ -74,7 +89,7 @@ public boolean addChild(TreeObject target, TreeObject child) { if (is_ok) { return true; } - } else if (children[i].flag == Constant.CHILD) { + } else if (children[i].getFlag() == Constant.CHILD) { if (children[i] == target) { TreeParent parent = children[i].getParent(); parent.addChild(child); @@ -94,7 +109,7 @@ public boolean addChild(TreeObject target, TreeObject child) { public boolean removeSelectedChild(TreeObject target) { TreeObject[] children = this.getChildren(); for (int i = 0; i < children.length; i++) { - if (children[i].flag == Constant.PARENT) { + if (children[i].getFlag() == Constant.PARENT) { // if target is folder if (target == children[i]) { // delete child @@ -107,7 +122,7 @@ public boolean removeSelectedChild(TreeObject target) { if (is_ok) { return true; } - } else if (children[i].flag == Constant.CHILD) { + } else if (children[i].getFlag() == Constant.CHILD) { if (children[i] == target) { TreeParent parent = children[i].getParent(); parent.removeChild(target);