package com.cari.voip.keyboard.soft.views; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Region; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.ui.part.ViewPart; import org.eclipse.zest.core.widgets.Graph; import org.eclipse.zest.core.widgets.GraphItem; import org.eclipse.zest.core.widgets.GraphNode; import org.eclipse.zest.core.widgets.ZestStyles; import org.eclipse.zest.core.widgets.internal.GraphLabel; import org.eclipse.zest.layouts.LayoutEntity; import org.eclipse.zest.layouts.LayoutStyles; import org.eclipse.zest.layouts.algorithms.AbstractLayoutAlgorithm; import org.eclipse.zest.layouts.algorithms.GridLayoutAlgorithm; import org.eclipse.zest.layouts.algorithms.HorizontalTreeLayoutAlgorithm; import org.eclipse.zest.layouts.algorithms.SpringLayoutAlgorithm; import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm; import org.eclipse.zest.layouts.dataStructures.InternalNode; import com.cari.voip.keyboard.soft.Activator; import com.cari.voip.keyboard.soft.adapter.switchUsers.SwitchUsersAdapterFactory; import com.cari.voip.keyboard.soft.image.MenuImage; import com.cari.voip.keyboard.soft.image.NodeImage; import com.cari.voip.keyboard.soft.model.Presence; import com.cari.voip.keyboard.soft.model.switchUsers.SwitchEntity; import com.cari.voip.keyboard.soft.model.switchUsers.SwitchUser; import com.cari.voip.keyboard.soft.model.switchUsers.SwitchUsersGroup; import com.cari.voip.keyboard.soft.model.switchUsers.SwitchUsersSession; import com.cari.voip.keyboard.soft.views.zest.LooseGridLayoutAlgorithm; import com.cari.voip.keyboard.soft.views.zest.SwitchGraph; import com.cari.voip.keyboard.soft.views.zest.SwitchGroupGraphNode; import com.cari.voip.keyboard.soft.views.zest.SwitchUserComparatorbyFirst; import com.cari.voip.keyboard.soft.views.zest.SwitchUserGraphNode; public class GraphNodeView extends ViewPart implements PropertyChangeListener{ public static final String ID_VIEW = "com.cari.voip.keyboard.soft.views.GraphNodeView"; private SwitchGraph graph; private GridLayoutAlgorithm gridLayout = new GridLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING); private TreeLayoutAlgorithm treeLayout = new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING); private HorizontalTreeLayoutAlgorithm horizontalLayout = new HorizontalTreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING); private SpringLayoutAlgorithm springLayout = new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING); private LooseGridLayoutAlgorithm looseLayout= new LooseGridLayoutAlgorithm(LayoutStyles.NONE); private AbstractLayoutAlgorithm layout; private Label label; private SwitchUserGraphNode selectedNode = null; private SwitchUsersSession session; private Menu contextMenu; private MenuItem itemCall; private MenuItem itemMsg; private MenuItem itemDisplayResort; private IAdapterFactory adapterFactory=null; private SwitchEntity model = null; private Image image = NodeImage.SwitchUserOnLine; public GraphNodeView() { super(); } @Override public void createPartControl(Composite parent) { //Composite comp= new Composite(parent, SWT.NONE); //comp.setLayout(new FillLayout(SWT.VERTICAL)); this.graph = new SwitchGraph(parent,SWT.BORDER|SWT.LEFT_TO_RIGHT|SWT.V_SCROLL); this.graph.animation = false; this.graph.setDragable(true); this.graph.setBackground(ColorConstants.listBackground); this.graph.LIGHT_BLUE = ColorConstants.listBackground;//new Color(null, 216, 228, 248); this.graph.DARK_BLUE = ColorConstants.black;//new Color(null, 1, 70, 122); //this.graph.HIGHLIGHT_COLOR = ColorConstants.yellow; //.graph. makeContextMenu(this.graph); this.graph.setMenu(this.contextMenu); /*this.graph.addListener(SWT.Resize, new Listener(){ public void handleEvent (Event event){ if(layout != null){ graph.setLayoutAlgorithm(layout, true); } } });*/ this.graph.addMouseListener(new MouseListener(){ /** * Sent when a mouse button is pressed twice within the * (operating system specified) double click period. * * @param e an event containing information about the mouse double click * * @see org.eclipse.swt.widgets.Display#getDoubleClickTime() */ public void mouseDoubleClick(MouseEvent event){ /* if (selectedNode != null) { if(!selectedNode.isEnabled()){ return; } selectedNode.changePresence(); }*/ } /** * Sent when a mouse button is pressed. * * @param e an event containing information about the mouse button press */ public void mouseDown(MouseEvent e){ } /** * Sent when a mouse button is released. * * @param e an event containing information about the mouse button release */ public void mouseUp(MouseEvent e){ if (selectedNode != null) { if(!selectedNode.isEnabled()){ return; } if(session != null){ session.input(SwitchUsersSession.INPUT_TYPE_USER, selectedNode.getModel()); } } } }); this.graph.addSelectionListener(new SelectionListener(){ public void widgetSelected(SelectionEvent event){ if (event.item == null) { selectedNode = null; }else{ if(event.item.getData() != null){ Object obj = event.item.getData(); if(obj instanceof SwitchUserGraphNode){ selectedNode = (SwitchUserGraphNode)obj; } } } } public void widgetDefaultSelected(SelectionEvent event){} }); /*this.graph.addMouseListener(new MouseListener(){ public void mouseDoubleClick(MouseEvent e){ label.setText(e.getSource().getClass().getName()); } public void mouseDown(MouseEvent e){ } public void mouseUp(MouseEvent e){ label.setText(e.getSource().getClass().getName()); } });*/ /*GraphNode b = new GraphNode(graph,SWT.NONE,"b",image); b.setData(b); GraphNode c = new GraphNode(graph,SWT.NONE,"c",image); c.setData(c);*/ this.looseLayout.setComparator(new SwitchUserComparatorbyFirst<LayoutEntity>()); layout = this.looseLayout; /*if(a != null){ Dimension size = a.getSize(); Dimension p = graph.getViewport().getSize(); int colNum = p.width/size.width; colNum = Math.max(1,colNum); int rowNum = (nodeNum+colNum -1)/colNum; graph.setPreferredSize(colNum*size.width, rowNum*size.height); }*/ //graph.setPreferredSize(2000, 2000); if(Activator.usersFirstShow){ Activator.usersFirstShow = false; if(this.model == null && this.adapterFactory == null){ SwitchUsersSession session = Activator.getSwitchUsersSession(); if(session != null){ this.model = session.getMembersGroup(); } this.adapterFactory = new SwitchUsersAdapterFactory(); } makeGraphNodesFromModel(); } } private void makeContextMenu(Composite parent) { this.contextMenu = new Menu(parent); this.contextMenu.addMenuListener(new MenuListener(){ public void menuShown(MenuEvent e){ if(graph.getSelection().size() < 1){ if(itemCall != null){ itemCall.setEnabled(false); } if(itemMsg != null){ itemMsg.setEnabled(false); } if(itemDisplayResort != null){ itemDisplayResort.setEnabled(true); } } else{ if(itemDisplayResort != null){ itemDisplayResort.setEnabled(false); } if(itemCall != null){ itemCall.setEnabled(true); } if(itemMsg != null){ boolean enable = true; Object m = getModel(); if(session != null && m != null && m instanceof SwitchUsersGroup){ SwitchUsersGroup g = (SwitchUsersGroup)m; if(g.getParent() == session.getgatewayUserManager()){ enable = false; } } itemMsg.setEnabled(enable); } } } public void menuHidden(MenuEvent e){ } }); /* this.itemCall = new MenuItem(this.contextMenu,SWT.PUSH); this.itemCall.setText("����"); this.itemCall.setImage(MenuImage.SwitchUserCall); //itemCall.setData(a); this.itemCall.addSelectionListener(new SelectionListener(){ public void widgetSelected(SelectionEvent event){ List selectList = graph.getSelection(); if(selectList.size() > 0){ Iterator iter = selectList.iterator(); while(iter.hasNext()){ GraphItem item = (GraphItem)iter.next(); if(item != null && item instanceof SwitchUserGraphNode){ //((SwitchUserGraphNode)item).changePresence(); if(!((SwitchUserGraphNode)item).isEnabled()){ continue; } if(session != null){ session.input(SwitchUsersSession.INPUT_TYPE_USER, ((SwitchUserGraphNode)item).getModel()); } } } } } public void widgetDefaultSelected(SelectionEvent e){ } }); */ this.itemMsg = new MenuItem(this.contextMenu,SWT.PUSH); this.itemMsg.setText("����"); this.itemMsg.setImage(MenuImage.SwitchUserMsg); //itemCall.setData(a); this.itemMsg.addSelectionListener(new SelectionListener(){ public void widgetSelected(SelectionEvent event){ List selectList = graph.getSelection(); int listSize; if(selectList != null && (listSize = selectList.size()) > 0){ StringBuilder tob = new StringBuilder(listSize*10); Iterator iter = selectList.iterator(); while(iter.hasNext()){ GraphItem item = (GraphItem)iter.next(); if(item != null && item instanceof SwitchUserGraphNode){ //((SwitchUserGraphNode)item).changePresence(); if(!((SwitchUserGraphNode)item).isEnabled()){ continue; } SwitchEntity m = ((SwitchUserGraphNode)item).getModel(); if(m != null && m instanceof SwitchUser){ tob.append(((SwitchUser)m).getUserId()+";"); } } } showMsgView(tob.toString()); } } public void widgetDefaultSelected(SelectionEvent e){ } }); this.itemDisplayResort = new MenuItem(this.contextMenu,SWT.PUSH); this.itemDisplayResort.setText("����"); this.itemDisplayResort.setImage(MenuImage.GraphNodeLayout); //itemCall.setData(a); this.itemDisplayResort.addSelectionListener(new SelectionListener(){ public void widgetSelected(SelectionEvent event){ graph.setLayoutAlgorithm(layout, true); } public void widgetDefaultSelected(SelectionEvent e){ } }); } public void showMsgView(String to){ IWorkbenchPage page = getSite().getPage(); MsgView view = null; IViewReference[] viewRefs = page.getViewReferences(); for(IViewReference viewRef:viewRefs){ if(viewRef.getId().equals(MsgView.ID_VIEW)){ MsgView viewTmp = (MsgView)viewRef.getView(true); //if(viewTmp.getModel().equals(obj)){ view = viewTmp; //} } } if(view == null){ try{ view = (MsgView)page.showView(MsgView.ID_VIEW, "", IWorkbenchPage.VIEW_ACTIVATE); view.setTo(to); }catch(Exception e){ if(view != null){ view.dispose(); } e.printStackTrace(); } }else{ view.setTo(to); page.activate(view); } } protected void addUser(Object newSwitchUser){ if(newSwitchUser != null && newSwitchUser instanceof SwitchUser){ IWorkbenchAdapter childAdapter = (IWorkbenchAdapter) this.adapterFactory.getAdapter(newSwitchUser, IWorkbenchAdapter.class); if(childAdapter == null){ return; } image = NodeImage.getImageFromSwitchUserPresence((SwitchUser)newSwitchUser); if(image == null){ if(childAdapter.getImageDescriptor(newSwitchUser) != null){ image = childAdapter.getImageDescriptor(newSwitchUser).createImage(); } else{ image = NodeImage.SwitchUserOffLine; } } SwitchUserGraphNode a = new SwitchUserGraphNode((SwitchEntity)newSwitchUser,this.graph,SWT.NO_BACKGROUND, childAdapter.getLabel(newSwitchUser), image); a.setData(a); this.graph.setLayoutAlgorithm(this.layout, true); } } public void propertyChange(final PropertyChangeEvent evt) { Activator.getDisplay().asyncExec(new Runnable() { public void run() { if(evt.getPropertyName().equals(SwitchUsersGroup.PROP_USER_ADD)){ addUser(evt.getNewValue()); } } }); } public void makeGraphNodesFromModel(){ if(this.session == null){ this.session = Activator.getSwitchUsersSession(); } if(this.model == null || this.adapterFactory == null){ return; } IWorkbenchAdapter adapter = (IWorkbenchAdapter) this.adapterFactory.getAdapter(this.model, IWorkbenchAdapter.class); if(adapter == null){ return; } this.graph.setModel(this.model); Object[] children = adapter.getChildren(this.model); if(children.length < 1){ this.model.addPropertyChangeListener(this); return; } this.model.addPropertyChangeListener(this); IWorkbenchAdapter childAdapter = (IWorkbenchAdapter) this.adapterFactory.getAdapter(children[0], IWorkbenchAdapter.class); if(childAdapter == null){ return; } for(Object child:children){ if(child instanceof SwitchEntity){ if(child instanceof SwitchUser){ image = NodeImage.getImageFromSwitchUserPresence((SwitchUser)child); } if(image == null){ if(childAdapter.getImageDescriptor(child) != null){ image = childAdapter.getImageDescriptor(child).createImage(); } else{ image = NodeImage.SwitchUserOffLine; } } SwitchUserGraphNode a = new SwitchUserGraphNode((SwitchEntity)child,this.graph,SWT.NO_BACKGROUND, childAdapter.getLabel(child), image); a.setData(a); } } this.graph.setLayoutAlgorithm(this.layout, true); } public void setAdapterFactory(IAdapterFactory adapterFactory){ this.adapterFactory = adapterFactory; } public IAdapterFactory getAdapterFactory(){ return this.adapterFactory; } public void setModel(Object obj){ if(obj instanceof SwitchEntity){ this.model = (SwitchEntity)obj; } } public Object getModel(){ return this.model; } public void setName(String partName){ this.setPartName(partName); } @Override public void setFocus() { // TODO Auto-generated method stub this.graph.setFocus(); } public void dispose() { if(this.model != null){ try{ this.model.removePropertyChangeListener(this); }catch(Exception e){ } } super.dispose(); } }