package gr.uom.java.ast.visualization; import gr.uom.java.distance.CandidateRefactoring; import gr.uom.java.distance.MoveMethodCandidateRefactoring; import gr.uom.java.jdeodorant.refactoring.views.FeatureEnvy; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.FigureCanvas; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.Layer; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.MouseMotionListener; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.text.AbstractInformationControl; import org.eclipse.jface.text.IInformationControlExtension2; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; public class FeatureEnviedMethodInformationControl extends AbstractInformationControl implements IInformationControlExtension2 { private FigureCanvas toolTipCanvas; private PMClassFigure classFigure; FeatureEnviedMethodInformationControl(Shell parent, ToolBarManager manager) { super(parent, manager); create(); } public boolean hasContents() { //only put tooltip when the classFigure is selected and it contains methods affected by feature envy return (!classFigure.getCandidates().isEmpty() && classFigure.isSelected()); } public void setInput(Object input) { setInput((PMClassFigure) input); } private void setInput(PMClassFigure classFigure){ this.classFigure = classFigure; Layer root = new Layer(); ToolbarLayout layout = new ToolbarLayout(); layout.setSpacing(5); root.setLayoutManager(layout); Label className = new Label(classFigure.getName(), DecorationConstants.CLASS); className.setFont(DecorationConstants.normalFont); root.add(className); ArrayList<CandidateRefactoring> candidates = (ArrayList<CandidateRefactoring>) classFigure.getCandidates(); for(CandidateRefactoring candidate: candidates){ final CandidateRefactoring candidateRefactoring = candidate; MoveMethodCandidateRefactoring moveCandidate = (MoveMethodCandidateRefactoring) candidate; String moveMethodName = moveCandidate.getSourceMethod().getMethodObject().getSignature(); final String targetClassName = moveCandidate.getTarget(); EntityFigure methodFigure =new EntityFigure(moveMethodName, DecorationConstants.METHOD, false); methodFigure.addMouseMotionListener(new MouseMotionListener(){ Color currentColor; public void mouseDragged(MouseEvent me) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent me) { List<PMClassFigure> classFigures = PackageMapDiagram.allClassFigures; for(PMClassFigure figure: classFigures){ if(figure.getName().equals(targetClassName)){ currentColor = figure.getBackgroundColor(); figure.setBackgroundColor(ColorConstants.green); } } } public void mouseExited(MouseEvent me) { List<PMClassFigure> classFigures = PackageMapDiagram.allClassFigures; for(PMClassFigure figure: classFigures){ if(figure.getName().equals(targetClassName)) figure.setBackgroundColor(currentColor); } } public void mouseHover(MouseEvent me) { // TODO Auto-generated method stub } public void mouseMoved(MouseEvent me) { // TODO Auto-generated method stub } }); methodFigure.addMouseListener(new MouseListener(){ public void mousePressed(MouseEvent me) { // TODO Auto-generated method stub IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IViewPart viewPart = page.findView("gr.uom.java.jdeodorant.views.FeatureEnvy"); if(viewPart != null){ FeatureEnvy featureEnvy = (FeatureEnvy) viewPart; featureEnvy.setSelectedLine(candidateRefactoring); } } public void mouseReleased(MouseEvent me) { // TODO Auto-generated method stub } public void mouseDoubleClicked(MouseEvent me) { // TODO Auto-generated method stub } }); root.add(methodFigure); } toolTipCanvas.setContents(root); } @Override protected void createContent(Composite parent) { toolTipCanvas = new FigureCanvas(parent,SWT.DOUBLE_BUFFERED); toolTipCanvas.setBackground(ColorConstants.white); } @Override public Point computeSizeHint() { Rectangle trim = super.computeTrim(); Point size; Point actualSize = toolTipCanvas.computeSize(SWT.DEFAULT, SWT.DEFAULT); if(actualSize.y>200) size = new Point (actualSize.x, 200); else size = actualSize; size.x += trim.width * 2; size.y += trim.height; return size; } }