Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslewis2005-05-17 05:49:30 +0000
committerslewis2005-05-17 05:49:30 +0000
commit5394f72d31d3ad6ca7dd9181b5998a6487505566 (patch)
treed100f9a10baf5aaf8570162950565c9552a85b2c
parentb5d95415f66b061e012ed3fe0db0d20d563025c4 (diff)
downloadorg.eclipse.ecf-5394f72d31d3ad6ca7dd9181b5998a6487505566.tar.gz
org.eclipse.ecf-5394f72d31d3ad6ca7dd9181b5998a6487505566.tar.xz
org.eclipse.ecf-5394f72d31d3ad6ca7dd9181b5998a6487505566.zip
Added DiscoveryView
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF3
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/plugin.xml6
-rw-r--r--framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/DiscoveryView.java311
3 files changed, 319 insertions, 1 deletions
diff --git a/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF b/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF
index 5e8376e02..4f6528eec 100644
--- a/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF
+++ b/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF
@@ -10,7 +10,8 @@ Require-Bundle: org.eclipse.ecf,
org.eclipse.jface.text,
org.eclipse.ui;reprovide=true,
org.eclipse.core.runtime,
- org.eclipse.ecf.presence
+ org.eclipse.ecf.presence,
+ org.eclipse.ecf.discovery
Eclipse-AutoStart: true
Provide-Package: org.eclipse.ecf.ui,
org.eclipse.ecf.ui.views
diff --git a/framework/bundles/org.eclipse.ecf.ui/plugin.xml b/framework/bundles/org.eclipse.ecf.ui/plugin.xml
index 29e181b2e..c174ddc18 100644
--- a/framework/bundles/org.eclipse.ecf.ui/plugin.xml
+++ b/framework/bundles/org.eclipse.ecf.ui/plugin.xml
@@ -15,5 +15,11 @@
category="org.eclipse.ecf.ui.viewcategory"
name="ECF Buddy List"
id="org.eclipse.ecf.ui.view.rosterview"/>
+ <view
+ category="org.eclipse.ecf.ui.viewcategory"
+ class="org.eclipse.ecf.ui.views.DiscoveryView"
+ icon="icons/person.gif"
+ id="org.eclipse.ecf.ui.view.discoveryview"
+ name="ECF Service Discovery"/>
</extension>
</plugin>
diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/DiscoveryView.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/DiscoveryView.java
new file mode 100644
index 000000000..036e7e976
--- /dev/null
+++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/DiscoveryView.java
@@ -0,0 +1,311 @@
+package org.eclipse.ecf.ui.views;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.ecf.core.identity.ServiceID;
+import org.eclipse.ecf.discovery.IDiscoveryContainer;
+import org.eclipse.ecf.discovery.IServiceInfo;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+
+
+public class DiscoveryView extends ViewPart {
+ protected static final int TREE_EXPANSION_LEVELS = 2;
+ private TreeViewer viewer;
+ private Action doubleClickAction;
+
+ IDiscoveryContainer container = null;
+
+ public void setDiscoveryContainer(IDiscoveryContainer container) {
+ this.container = container;
+ }
+ class TreeObject implements IAdaptable {
+ private String name;
+ private TreeParent parent;
+ public TreeObject(String name) {
+ this.name = name;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setParent(TreeParent parent) {
+ this.parent = parent;
+ }
+ public TreeParent getParent() {
+ return parent;
+ }
+ public String toString() {
+ return getName();
+ }
+ public Object getAdapter(Class key) {
+ return null;
+ }
+ }
+
+ class TreeParent extends TreeObject {
+ private ArrayList children;
+ private ServiceID id;
+ public TreeParent(ServiceID id, String name) {
+ super(name);
+ this.id = id;
+ children = new ArrayList();
+ }
+ public ServiceID getID() {
+ return id;
+ }
+ public void addChild(TreeObject child) {
+ children.add(child);
+ child.setParent(this);
+ }
+ public void removeChild(TreeObject child) {
+ children.remove(child);
+ child.setParent(null);
+ }
+ public TreeObject [] getChildren() {
+ return (TreeObject [])children.toArray(new TreeObject[children.size()]);
+ }
+ public boolean hasChildren() {
+ return children.size()>0;
+ }
+ }
+
+ class ViewContentProvider implements IStructuredContentProvider,
+ ITreeContentProvider {
+ private TreeParent invisibleRoot;
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+ public void dispose() {
+ }
+ public Object[] getElements(Object parent) {
+ if (parent.equals(getViewSite())) {
+ if (invisibleRoot==null) initialize();
+ return getChildren(invisibleRoot);
+ }
+ 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;
+ }
+ private void initialize() {
+ invisibleRoot = new TreeParent(null,"");
+ }
+ void replaceOrAdd(TreeParent newEntry) {
+ TreeObject [] childs = invisibleRoot.getChildren();
+ for(int i=0; i < childs.length; i++) {
+ String childName = childs[i].getName();
+ if (childName.equals(newEntry.getName())) {
+ // It's already there...replace
+ invisibleRoot.removeChild(childs[i]);
+ }
+ }
+ // Now add
+ invisibleRoot.addChild(newEntry);
+ }
+ void addServiceInfo(ServiceID id) {
+ TreeParent newEntry = new TreeParent(id,id.getName());
+ replaceOrAdd(newEntry);
+ }
+ void addServiceInfo(IServiceInfo serviceInfo) {
+ if (serviceInfo == null) return;
+ ServiceID svcID = serviceInfo.getServiceID();
+ TreeParent newEntry = new TreeParent(svcID,svcID.getName());
+ InetAddress addr = serviceInfo.getAddress();
+ if (addr != null) {
+ TreeObject toaddr = new TreeObject("Address: "+addr.getHostAddress());
+ newEntry.addChild(toaddr);
+ }
+ TreeObject typeo = new TreeObject("Type: " + svcID.getServiceType());
+ newEntry.addChild(typeo);
+ TreeObject porto = new TreeObject("Port: " + serviceInfo.getPort());
+ newEntry.addChild(porto);
+ TreeObject prioo = new TreeObject("Priority: " + serviceInfo.getPriority());
+ newEntry.addChild(prioo);
+ TreeObject weighto = new TreeObject("Weight: " + serviceInfo.getWeight());
+ newEntry.addChild(weighto);
+ Map props = serviceInfo.getProperties();
+ if (props != null) {
+ for(Iterator i=props.keySet().iterator(); i.hasNext(); ) {
+ Object key = i.next();
+ if (key instanceof String) {
+ String keys = (String) key;
+ Object val = props.get(key);
+ if (val instanceof String) {
+ TreeObject prop = new TreeObject(keys+"="+(String)val);
+ newEntry.addChild(prop);
+ }
+ }
+ }
+ }
+ replaceOrAdd(newEntry);
+ }
+ void removeServiceInfo(IServiceInfo serviceInfo) {
+ if (serviceInfo == null) return;
+ ServiceID svcID = serviceInfo.getServiceID();
+ TreeObject [] childs = (TreeObject []) invisibleRoot.getChildren();
+ for(int i=0; i < childs.length; i++) {
+ if (childs[i] instanceof TreeParent) {
+ TreeParent parent = (TreeParent) childs[i];
+ String existingName = parent.getName();
+ if (existingName.equals(svcID.getName())) {
+ invisibleRoot.removeChild(parent);
+ }
+ }
+ }
+ }
+ }
+ class ViewLabelProvider extends LabelProvider {
+
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ public Image getImage(Object obj) {
+ String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
+ if (obj instanceof TreeParent)
+ imageKey = ISharedImages.IMG_OBJ_FOLDER;
+ return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
+ }
+ }
+ /**
+ * The constructor.
+ */
+ public DiscoveryView() {
+ }
+
+ public void addServiceInfo(final IServiceInfo serviceInfo) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ ViewContentProvider vcp = (ViewContentProvider) viewer
+ .getContentProvider();
+ if (vcp != null) {
+ vcp.addServiceInfo(serviceInfo);
+ refreshView();
+ }
+ } catch (Exception e) {
+ }
+ }
+ });
+ }
+ public void addServiceInfo(final ServiceID id) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ ViewContentProvider vcp = (ViewContentProvider) viewer
+ .getContentProvider();
+ if (vcp != null) {
+ vcp.addServiceInfo(id);
+ refreshView();
+ }
+ } catch (Exception e) {
+ }
+ }
+ });
+ }
+ public void removeServiceInfo(final IServiceInfo serviceInfo) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ ViewContentProvider vcp = (ViewContentProvider) viewer
+ .getContentProvider();
+ if (vcp != null) {
+ vcp.removeServiceInfo(serviceInfo);
+ refreshView();
+ }
+ } catch (Exception e) {
+ }
+ }
+ });
+ }
+ protected void refreshView() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ viewer.refresh();
+ expandAll();
+ } catch (Exception e) {
+ }
+ }
+ });
+ }
+ protected void expandAll() {
+ viewer.expandToLevel(TREE_EXPANSION_LEVELS);
+ }
+
+ protected TreeObject getSelectedTreeObject() {
+ ISelection selection = viewer.getSelection();
+ Object obj = ((IStructuredSelection) selection)
+ .getFirstElement();
+ TreeObject treeObject = (TreeObject) obj;
+ return treeObject;
+ }
+ public void createPartControl(Composite parent) {
+ viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new ViewContentProvider());
+ viewer.setLabelProvider(new ViewLabelProvider());
+ viewer.setInput(getViewSite());
+ doubleClickAction = new Action() {
+ public void run() {
+ TreeObject treeObject = getSelectedTreeObject();
+ if (treeObject instanceof TreeParent) {
+ TreeParent p = (TreeParent) treeObject;
+ final ServiceID targetID = p.getID();
+ if (container != null) {
+ container.requestServiceInfo(targetID,3000);
+ }
+ }
+ }
+ };
+ hookDoubleClickAction();
+ }
+
+ private void hookDoubleClickAction() {
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ doubleClickAction.run();
+ }
+ });
+ }
+ public void dispose() {
+ container = null;
+ }
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+} \ No newline at end of file

Back to the top