/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.tools; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.xmind.gef.event.MouseDragEvent; import org.xmind.gef.service.BendPointsFeedback; import org.xmind.gef.service.IBendPointsFeedback; import org.xmind.gef.service.IFeedback; import org.xmind.gef.service.IFeedbackService; import org.xmind.gef.service.IRectangleProvider; import org.xmind.gef.tool.ResizeTool; public abstract class FeedbackResizeTool extends ResizeTool { private class BoundsProvider implements IRectangleProvider { public Rectangle getRectangle() { return getResultArea(); } } private IBendPointsFeedback feedback; private boolean newFeedback; private IRectangleProvider oldBoundsProvider; private IRectangleProvider newBoundsProvider; protected void updateArea(Rectangle area, Point cursorPosition, MouseDragEvent me) { if (feedback != null) { updateAreaBounds(area, cursorPosition); feedback.update(); } } protected void start() { IFeedback feedback = getSourceFeedback(); if (feedback instanceof IBendPointsFeedback) { this.feedback = (IBendPointsFeedback) feedback; newFeedback = false; } else { this.feedback = createBendPointFeedbackPart(); newFeedback = true; } int orientation = this.feedback.getOrientation(getStartingPosition()); setOrientation(orientation); if (orientation != PositionConstants.NONE) { initFeedback(this.feedback); } else { this.feedback = null; } } protected abstract IFeedback getSourceFeedback(); protected void initFeedback(IBendPointsFeedback feedback) { if (newFeedback) { IFeedbackService feedbackService = (IFeedbackService) getTargetViewer() .getService(IFeedbackService.class); if (feedbackService != null) { feedbackService.addFeedback(feedback); } } oldBoundsProvider = feedback.getBoundsProvider(); if (oldBoundsProvider != null) { setInitArea(oldBoundsProvider.getRectangle()); } else { setInitArea(getSourceArea()); } newBoundsProvider = new BoundsProvider(); feedback.setBoundsProvider(newBoundsProvider); feedback.update(); } protected abstract Rectangle getSourceArea(); protected IBendPointsFeedback createBendPointFeedbackPart() { return new BendPointsFeedback(); } protected void end() { if (feedback != null) { removeFeedback(feedback); } } protected void removeFeedback(IBendPointsFeedback feedback) { feedback.setBoundsProvider(oldBoundsProvider); if (newFeedback) { IFeedbackService feedbackService = (IFeedbackService) getTargetViewer() .getService(IFeedbackService.class); if (feedbackService != null) { feedbackService.removeFeedback(feedback); } } else { feedback.update(); } feedback = null; } }