code: package gr.uom.java.jdeodorant.refactoring.views;
  
  import gr.uom.java.ast.visualization.FeatureEnvyDiagram;
  import gr.uom.java.ast.visualization.FeatureEnvyVisualizationData;
  import gr.uom.java.ast.visualization.GodClassDiagram2;
  import gr.uom.java.ast.visualization.GodClassVisualizationData;
  import gr.uom.java.ast.visualization.ZoomInputAction;
  import gr.uom.java.ast.visualization.VisualizationData;
  import gr.uom.java.ast.visualization.ZoomAction;
  import gr.uom.java.jdeodorant.refactoring.Activator;
  
  import org.eclipse.draw2d.ColorConstants;
  import org.eclipse.draw2d.FigureCanvas;
  import org.eclipse.draw2d.FreeformViewport;
  import org.eclipse.draw2d.ScalableFreeformLayeredPane;
  import org.eclipse.draw2d.geometry.Point;
  import org.eclipse.jface.action.Action;
  import org.eclipse.jface.action.ActionContributionItem;
  import org.eclipse.jface.action.IAction;
  import org.eclipse.jface.action.IMenuCreator;
  import org.eclipse.jface.action.IToolBarManager;
  import org.eclipse.jface.resource.ImageDescriptor;
  import org.eclipse.jface.viewers.ISelection;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.KeyEvent;
  import org.eclipse.swt.events.KeyListener;
  import org.eclipse.swt.events.MouseEvent;
  import org.eclipse.swt.events.MouseWheelListener;
  import org.eclipse.swt.layout.FillLayout;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Control;
  import org.eclipse.swt.widgets.Menu;
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.part.ViewPart;
  
  public class CodeSmellVisualization extends ViewPart {
  
  	public static final String ID = "gr.uom.java.jdeodorant.views.CodeSmellVisualization";
  	private FigureCanvas figureCanvas; 
  	private ScalableFreeformLayeredPane root = null;
  	private boolean ctrlPressed= false;
  
  	public void createPartControl(Composite parent) {
  
  		parent.setLayout(new FillLayout());
  
  		figureCanvas = new FigureCanvas(parent, SWT.DOUBLE_BUFFERED);
  		figureCanvas.setBackground(ColorConstants.white);
  
  		VisualizationData data = CodeSmellVisualizationDataSingleton.getData();
  
  		if(data != null) {
  			if(data instanceof GodClassVisualizationData) {
  				GodClassDiagram2 diagram = new GodClassDiagram2((GodClassVisualizationData)data);
  				root= diagram.getRoot();
  			}
  			if(data instanceof FeatureEnvyVisualizationData) {
  				FeatureEnvyDiagram diagram = new FeatureEnvyDiagram((FeatureEnvyVisualizationData)data);
  				root= diagram.getRoot();
  			}
  
  			figureCanvas.setViewport(new FreeformViewport());
  
  
  			figureCanvas.addKeyListener( new KeyListener() {
  
  				public void keyPressed(KeyEvent e) {
  					if(e.keyCode == SWT.CTRL){
  						ctrlPressed = true;
  					}
  				}
  
  				public void keyReleased(KeyEvent e) {
  					if(e.keyCode== SWT.CTRL)
  						ctrlPressed = false;
  
  				}
  			});
  
  			MouseWheelListener listener = new MouseWheelListener() {
  				private double scale;
  				private static final double ZOOM_INCRENENT = 0.1;
  				private static final double ZOOM_DECREMENT = 0.1;
  
  				private void zoom(int count, Point point) {
  					if (count > 0) {
  						scale += ZOOM_INCRENENT;
  
  					} else {
  						scale -= ZOOM_DECREMENT;
  					}
  
  					if (scale <= 0) {
  						scale = 0;
  					}
  					FreeformViewport viewport = (FreeformViewport) root.getParent();
  
  					if(scale>1){
  						viewport.setHorizontalLocation((int) (point.x*(scale -1)+ scale*viewport.getLocation().x));
  						viewport.setVerticalLocation((int) (point.y*(scale-1)+scale*viewport.getLocation().y));
  					}
  
  					root.setScale(scale);
  				}
  
  				public void mouseScrolled(MouseEvent e) {
  
  					if(ctrlPressed == true){
  						scale = root.getScale();
  						Point point = new Point(e.x,e.y);
  						int count = e.count;
  						zoom(count, point);
  
  					}
  
  				}
  			};
  
  			figureCanvas.addMouseWheelListener(listener);
  			figureCanvas.setContents(root);
  		}
  
  		// Custom Action for the View's Menu  
  		ImageDescriptor imageDescriptor = Activator.getImageDescriptor("/icons/" + "magnifier.png");
  		IActionBars bars = getViewSite().getActionBars();
  		IToolBarManager manager = bars.getToolBarManager();
  		Action act=new Action("Zoom",SWT.DROP_DOWN){};
  		act.setImageDescriptor(imageDescriptor);
  		act.setMenuCreator(new MyMenuCreator());
  		manager.add(act);
  	}
  
  
  	class MyMenuCreator implements IMenuCreator{
  
  		private IAction action;
  		private Menu menu;
  
  		public void selectionChanged(IAction action, ISelection selection)
  		{
  			if (action != this.action)
  			{
  				action.setMenuCreator(this);
  				this.action = action;
  			}
  		} 
  
  		public Menu getMenu(Control ctrl){
  			Menu menu = new Menu(ctrl);
  			addActionToMenu(menu, newZoomAction(0.5));
  			addActionToMenu(menu, newZoomAction(1));
  			addActionToMenu(menu, newZoomAction(2));
  			addActionToMenu(menu, newZoomAction(0));
  
  			ZoomInputAction inputZoomAction = new ZoomInputAction(root);
  			inputZoomAction.setText("Other...");
  
  			addActionToMenu(menu, inputZoomAction);
  			return menu;
  
  		}
  
  		public void dispose() {
  			if (menu != null)
  			{
  				menu.dispose();
  			}
  		}
  
  		public Menu getMenu(Menu parent) {
  			return null;
  		}
  
  		private void addActionToMenu(Menu menu, IAction action)
  		{
  			ActionContributionItem item= new ActionContributionItem(action);
  			item.fill(menu, -1);
  		}
  	}
  
  	public void setFocus() {
  
  	}
  
  	public ZoomAction newZoomAction(double scale){
  		ZoomAction zoomAction = new ZoomAction(root, scale);
  		if(scale != 0){
  			double percent = scale*100;
  			zoomAction.setText((int) percent +"%");
  			zoomAction.setImageDescriptor(Activator.getImageDescriptor("/icons/" + "magnifier.png"));
  		}else
  			zoomAction.setText("Scale to Fit");
  		return zoomAction;
  	}
  
  }
  