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.gef.EditDomain;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
import org.eclipse.jface.viewers.ISelectionProvider;
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.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
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.ui.views.properties.IPropertySource;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphItem;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.AbstractLayoutAlgorithm;
import com.cari.voip.keyboard.soft.Activator;
import com.cari.voip.keyboard.soft.adapter.switchUsers.SwitchUsersAdapterFactory;
import com.cari.voip.keyboard.soft.editors.edit.SwitchUserEditPartFactory;
import com.cari.voip.keyboard.soft.editors.graphicalView.SwitchUserGraphicalViewer;
import com.cari.voip.keyboard.soft.image.MenuImage;
import com.cari.voip.keyboard.soft.image.NodeImage;
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.SwitchUsersManager;
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.SwitchUserGraphNode;
public class GraphGroupView extends ViewPart implements PropertyChangeListener{
public static final String ID_VIEW =
"com.cari.voip.keyboard.soft.views.GraphGroupView";
/*
//private GraphicalViewer graphicalViewer = null;
//private EditDomain editDomain = null;
//private SwitchUsersGroup diagram = null;
*/
private SwitchGraph graph;
private LooseGridLayoutAlgorithm looseLayout=
new LooseGridLayoutAlgorithm(LayoutStyles.NONE);
private AbstractLayoutAlgorithm layout;
private Menu contextMenu;
private MenuItem itemCall;
private MenuItem itemMsg;
private MenuItem itemDisplayResort;
private SwitchGroupGraphNode selectedNode= null;
private SwitchEntity model = null;
private IAdapterFactory adapterFactory=null;
private SwitchUsersSession session;
private Image image = NodeImage.groupImage;
public GraphGroupView() {
super();
//this.editDomain = new EditDomain();
}
@Override
public void createPartControl(Composite parent) {
//createGraphicalViewer(parent);
this.graph = new SwitchGraph(parent,SWT.BORDER|SWT.LEFT_TO_RIGHT|SWT.V_SCROLL);
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);
makeContextMenu(this.graph);
this.graph.setMenu(this.contextMenu);
this.graph.addMouseListener(new MouseListener(){
public void mouseDoubleClick(MouseEvent event){
/*if (selectedNode != null) {
//if(!selectedNode.isEnabled()){
// return;
//}
Activator.showViewFromModel(getSite().getPage(),selectedNode.getModel());
}*/
}
public void mouseDown(MouseEvent e){
}
public void mouseUp(MouseEvent e){
if (selectedNode != null) {
if(session != null){
Activator.showUserViewFromModel(getSite().getPage(),selectedNode.getModel());
session.input(SwitchUsersSession.INPUT_TYPE_GROUP,
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 SwitchGroupGraphNode){
selectedNode = (SwitchGroupGraphNode)obj;
}
}
}
}
public void widgetDefaultSelected(SelectionEvent event){}
});
layout = this.looseLayout;
makeGraphNodesFromModel();
}
/*
protected void configureGraphicalViewer() {
GraphicalViewer viewer = getGraphicalViewer();
viewer.setEditPartFactory(new SwitchUserEditPartFactory());
viewer.setRootEditPart(new ScalableFreeformRootEditPart());
viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer));
}
protected void initializeGraphicalViewer() {
GraphicalViewer viewer = getGraphicalViewer();
((SwitchUserGraphicalViewer) viewer).hookPaintListener();
if(this.diagram != null){
viewer.setContents(this.diagram);
((SwitchUserGraphicalViewer) viewer).applyLayout();
}
}
protected void createGraphicalViewer(Composite parent) {
GraphicalViewer viewer = new SwitchUserGraphicalViewer();
viewer.createControl(parent);
setGraphicalViewer(viewer);
configureGraphicalViewer();
hookGraphicalViewer();
initializeGraphicalViewer();
}
private void hookGraphicalViewer() {
getSite().setSelectionProvider(getGraphicalViewer());
}
protected GraphicalViewer getGraphicalViewer() {
return this.graphicalViewer;
}
protected EditDomain getEditDomain(){
return this.editDomain;
}
protected void setGraphicalViewer(GraphicalViewer viewer) {
EditDomain dm = getEditDomain();
if( dm != null){
dm.addViewer(viewer);
}
this.graphicalViewer = viewer;
}
public void makeGraphNodesFromModel(){
GraphicalViewer viewer = getGraphicalViewer();
if(viewer != null && this.diagram != null){
viewer.setContents(this.diagram);
((SwitchUserGraphicalViewer) viewer).applyLayout();
}
}
*/
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){
itemMsg.setEnabled(true);
}
}
}
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 SwitchGroupGraphNode){
Activator.showViewFromModel(getSite().getPage(),selectedNode.getModel());
//((SwitchUserGraphNode)item).changePresence();
if(!((SwitchGroupGraphNode)item).isEnabled()){
continue;
}
if(session != null){
session.input(SwitchUsersSession.INPUT_TYPE_GROUP,
((SwitchGroupGraphNode)item).getModel());
}
}
}
}
}
public void widgetDefaultSelected(SelectionEvent e){
}
});
*/
if(Activator.groupsFirstShow){
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 = selectList.size();
if(listSize > 0){
Iterator iter = selectList.iterator();
StringBuilder tob = new StringBuilder(listSize*10);
while(iter.hasNext()){
GraphItem item = (GraphItem)iter.next();
if(item != null &&
item instanceof SwitchGroupGraphNode){
//((SwitchUserGraphNode)item).changePresence();
if(!((SwitchGroupGraphNode)item).isEnabled()){
continue;
}
SwitchEntity m = ((SwitchGroupGraphNode)item).getModel();
if(m != null && m instanceof SwitchUsersGroup){
SwitchUser[] users = (SwitchUser[])((SwitchUsersGroup)m).getSwitchUsersArray();
if(users != null && users.length > 0){
for(int i = 0; i<users.length;i++){
tob.append(users[i].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);
}
}
public synchronized void makeGraphNodesFromModel(){
if(this.session == null){
this.session = Activator.getSwitchUsersSession();
}
if(session == null){
return;
}
if(Activator.groupsFirstShow){
Activator.groupsFirstShow = false;
if(this.model == null ){
this.model = session.getlocalUserManager();
}if(this.adapterFactory == null){
this.adapterFactory = new SwitchUsersAdapterFactory();
}
}
else{
if(this.model == null ){
this.model = session.getgatewayUserManager();
}if(this.adapterFactory == null){
this.adapterFactory = new SwitchUsersAdapterFactory();
}
}
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);
this.setName(adapter.getLabel(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(image == null){
if(childAdapter.getImageDescriptor(child) != null){
image = childAdapter.getImageDescriptor(child).createImage();
}
else{
image = NodeImage.groupImage;
}
}
SwitchGroupGraphNode a = new SwitchGroupGraphNode((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() {
/*GraphicalViewer viewer = getGraphicalViewer();
if(viewer != null){
viewer.getControl().setFocus();
}*/
this.graph.setFocus();
}
public void dispose() {
if(this.model != null){
try{
this.model.removePropertyChangeListener(this);
}catch(Exception e){
}
}
super.dispose();
}
@Override
public void propertyChange(final PropertyChangeEvent evt) {
Activator.getDisplay().asyncExec(new Runnable() {
public void run() {
if(evt.getPropertyName().equals(SwitchUsersManager.PROP_GROUP_ADD)){
addgroup(evt.getNewValue());
}
}
});
}
protected void addgroup(Object newValue) {
if(newValue != null &&
newValue instanceof SwitchUsersGroup){
IWorkbenchAdapter childAdapter = (IWorkbenchAdapter)
this.adapterFactory.getAdapter(newValue, IWorkbenchAdapter.class);
if(childAdapter == null){
return;
}
if(image == null){
if(childAdapter.getImageDescriptor(newValue) != null){
image = childAdapter.getImageDescriptor(newValue).createImage();
}
else{
image = NodeImage.groupImage;
}
}
SwitchGroupGraphNode a = new SwitchGroupGraphNode((SwitchEntity)newValue,this.graph,SWT.NO_BACKGROUND,
childAdapter.getLabel(newValue),
image);
a.setData(a);
this.graph.setLayoutAlgorithm(this.layout, true);
}
}
}