toolentryeditpart.java

来自「mywork是rcp开发的很好的例子」· Java 代码 · 共 555 行 · 第 1/2 页

JAVA
555
字号
/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.gef.internal.ui.palette.editparts;

import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.ACC;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;

import org.eclipse.ui.IMemento;

import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.ButtonBorder;
import org.eclipse.draw2d.ButtonModel;
import org.eclipse.draw2d.Clickable;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.Toggle;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Rectangle;

import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.internal.ui.palette.PaletteColorUtil;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteStack;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.ui.palette.PaletteViewerPreferences;
import org.eclipse.gef.ui.palette.editparts.IPinnableEditPart;
import org.eclipse.gef.ui.palette.editparts.PaletteEditPart;

/**
 * @author Administrator
 *	使图集 工具栏始终为 ICONS_ONLY
 */
public class ToolEntryEditPart
	extends PaletteEditPart
{

class MenuTimer implements Runnable {
	public static final int MENU_TIMER_DELAY = 400;
	
	private boolean enabled = true;
	
	public void disable() {
		enabled = false;
	}
	
	public void run() {
		if (enabled) {
			getButtonModel().setArmed(false);
			getButtonModel().setPressed(false);
			((IPaletteStackEditPart)getParent()).openMenu();
			getViewer().getEditDomain().loadDefaultTool();
		}
	}
}

abstract class ToggleButtonTracker extends SingleSelectionTracker {
	private MenuTimer timer = null;
	
	protected void enableTimer() {
		timer = new MenuTimer();
		getViewer().getControl().getDisplay().timerExec(MenuTimer.MENU_TIMER_DELAY, 
				timer);
	}
	
	protected void disableTimer() {
		if (timer != null) {
			timer.disable();
			timer = null;
		}
	}
	
	protected boolean handleButtonDown(int button) {
		if (getParent() instanceof IPaletteStackEditPart)
			enableTimer();
		
		if (button == 2 && isInState(STATE_INITIAL))
			performConditionalSelection();
		super.handleButtonDown(button);
		if (button == 1) {
			getFigure().internalGetEventDispatcher().requestRemoveFocus(getFigure());
			getButtonModel().setArmed(true);
			getButtonModel().setPressed(true);
		}
		return true;
	}
	
	protected boolean handleDrag() {
		org.eclipse.draw2d.geometry.Point point = getLocation().getCopy();
		getFigure().translateToRelative(point);
		if (!getFigure().containsPoint(point)) {
			getButtonModel().setArmed(false);
			getButtonModel().setMouseOver(false);
			disableTimer();
		} else {
			getButtonModel().setArmed(true);
			getButtonModel().setMouseOver(true);
		}
		return true;
	}

	protected boolean handleNativeDragFinished(DragSourceEvent event) {
		getPaletteViewer().setActiveTool(null);
		return true;
	}
}

class GTKToggleButtonTracker extends ToggleButtonTracker {
	int gtkState = 0;
	
	public void deactivate() {
		disableTimer();
		super.deactivate();
	}
	
	protected boolean handleButtonUp(int button) {
		disableTimer();
		
		// Workaround for Bug 96351.  It should be removed when Bug 35585 is fixed.
		if (gtkState == 1) {
			handleNativeDragFinished(null);
			return true;
		}
		
		if (button == 1) {
			getButtonModel().setPressed(false);
			getButtonModel().setArmed(false);
		}
		return super.handleButtonUp(button);
	}
	
	protected boolean handleNativeDragStarted(DragSourceEvent event) {
		disableTimer();
		gtkState = 1;
		return true;
	}	
}

class OtherToggleButtonTracker extends ToggleButtonTracker {
	
	private static final int WIN_THRESHOLD = 3;
	
	private Point mouseDownLoc = null;
	
	public void deactivate() {
		disableTimer();
		getButtonModel().setPressed(false);
		getButtonModel().setArmed(false);
		super.deactivate();
	}
	
	protected boolean handleButtonDown(int button) {	
		mouseDownLoc = new Point(getLocation().x, getLocation().y);
		return super.handleButtonDown(button);
	}
	
	protected boolean handleButtonUp(int button) {
		disableTimer();
		
		if (button == 1) {
			getButtonModel().setPressed(false);
			getButtonModel().setArmed(false);
		}
		return super.handleButtonUp(button);
	}
	
	protected boolean handleNativeDragStarted(DragSourceEvent event) {
		disableTimer();
		
		// win hack because button down is delayed
		if (getParent() instanceof IPaletteStackEditPart && SWT.getPlatform().equals("win32")) { //$NON-NLS-1$
			Point nds = getPaletteViewer().getControl().toControl(event.display.getCursorLocation());
			if (mouseDownLoc != null && (Math.abs(nds.x - mouseDownLoc.x) 
					+ Math.abs(nds.y - mouseDownLoc.y)) < WIN_THRESHOLD) {
				getButtonModel().setArmed(false);
				getButtonModel().setPressed(false);
				((IPaletteStackEditPart)getParent()).openMenu();
				getViewer().getEditDomain().loadDefaultTool();
				event.doit = false; 
				return false;
			}
		}

		getButtonModel().setPressed(false);
		getButtonModel().setArmed(false);
		return true;
	}
}

/**
 * The figure for for a <code>ToolEntryEditPart</code>.
 */
class ToolEntryToggle
    extends Toggle {

private boolean showHoverFeedback = false;

ToolEntryToggle(IFigure contents) {
    super(contents);
    setOpaque(false);
    setEnabled(true);
    if (isToolbarItem()) {
        setStyle(Clickable.STYLE_BUTTON | Clickable.STYLE_TOGGLE);
        setBorder(TOOLBAR_ITEM_BORDER);
    }
}
public boolean containsPoint(int x, int y) {
    Rectangle rect = getBounds().getCopy();
    if (customLabel.getBorder() == ICON_BORDER) {
        rect.width -= PinnablePaletteStackFigure.ARROW_WIDTH;
    } else if (customLabel.getBorder() == LIST_BORDER) {
        rect.width -= PinnablePaletteStackFigure.ARROW_WIDTH;
        rect.x += PinnablePaletteStackFigure.ARROW_WIDTH;    
    }
    return rect.contains(x, y);
}

public IFigure findMouseEventTargetAt(int x, int y) {
    return null;
}

public IFigure getToolTip() {
    return createToolTip();
}

public void setEnabled(boolean value) {
    super.setEnabled(value);
    if (isEnabled()) {
        setRolloverEnabled(true);
        if (getFlag(STYLE_BUTTON)) {
            setBorder(TOOLBAR_ITEM_BORDER);
        }
        setForegroundColor(null);
    } else {
        if (getFlag(STYLE_BUTTON)) {
            setBorder(null);
        }
        setRolloverEnabled(false);
        setForegroundColor(ColorConstants.gray);
    }
}

protected void paintFigure(Graphics graphics) {
    super.paintFigure(graphics);

    if (!isToolbarItem() && isEnabled() && isRolloverEnabled()) {
        ButtonModel model = getModel();

        if (model.isSelected()) {
            graphics.setBackgroundColor(PaletteColorUtil.getSelectedColor());
            graphics.fillRoundRectangle(getSelectionRectangle(
                getLayoutSetting(), customLabel), 3, 3);
        } else if (model.isMouseOver() || showHoverFeedback) {
            graphics.setBackgroundColor(PaletteColorUtil.getHoverColor());
            graphics.fillRoundRectangle(getSelectionRectangle(
                getLayoutSetting(), customLabel), 3, 3);
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?