/* ******************************************************************************
* 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.properties;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.xmind.core.Core;
import org.xmind.core.IImage;
import org.xmind.core.event.ICoreEventRegister;
import org.xmind.gef.GEF;
import org.xmind.gef.IGraphicalViewer;
import org.xmind.gef.Request;
import org.xmind.gef.part.IPart;
import org.xmind.ui.mindmap.IImagePart;
import org.xmind.ui.properties.MindMapPropertySectionPartBase;
import org.xmind.ui.viewers.MButton;
import org.xmind.ui.viewers.SWTUtils;
public class ImageSizePropertySectionPart extends
MindMapPropertySectionPartBase {
protected class InplaceSizeInput {
private Control hostControl;
private Spinner inputWidget;
public InplaceSizeInput(Control hostControl) {
this.hostControl = hostControl;
}
private void createInputWidget(Composite parent) {
inputWidget = new Spinner(parent, SWT.BORDER);
inputWidget.setMinimum(2);
inputWidget.setMaximum(9999);
inputWidget.setIncrement(5);
Listener sizeListener = new Listener() {
public void handleEvent(Event event) {
int value = inputWidget.getSelection();
if (hostControl == widthInput.getControl()) {
modifySize(value, Integer.parseInt(heightInput
.getText()));
} else {
modifySize(Integer.parseInt(widthInput.getText()),
value);
}
close();
}
};
inputWidget.addListener(SWT.DefaultSelection, sizeListener);
inputWidget.addListener(SWT.FocusOut, sizeListener);
inputWidget.addListener(SWT.KeyDown, new Listener() {
public void handleEvent(Event event) {
if (SWTUtils.matchKey(0, SWT.ESC, event.stateMask,
event.keyCode)) {
close();
}
}
});
inputWidget.addListener(SWT.Traverse, new Listener() {
public void handleEvent(Event event) {
if (event.detail == SWT.TRAVERSE_ESCAPE) {
close();
}
}
});
if (hostControl == widthInput.getControl()) {
inputWidget
.setSelection(Integer.parseInt(widthInput.getText()));
} else {
inputWidget.setSelection(Integer
.parseInt(heightInput.getText()));
}
}
public void open() {
if (hostControl instanceof Composite) {
createInputWidget((Composite) hostControl);
inputWidget.setLocation(0, 0);
Point size = hostControl.getSize();
inputWidget.setSize(size);
inputWidget.setFocus();
}
}
public void close() {
inputWidget.dispose();
}
protected Point getInitialLocation(Point initialSize) {
return hostControl.toDisplay(0, 0);
}
protected Point getInitialSize() {
return hostControl.getSize();
}
}
private MButton widthInput;
private MButton heightInput;
private Hyperlink resetSizeButton;
protected void createContent(Composite parent) {
createWidthHeightInput(parent);
createResetSizeButton(parent);
}
protected GridLayout createLayout(Composite parent) {
GridLayout layout = super.createLayout(parent);
layout.verticalSpacing = 10;
return layout;
}
private void createWidthHeightInput(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.verticalSpacing = 5;
gridLayout.horizontalSpacing = 5;
composite.setLayout(gridLayout);
createWidthInput(composite);
createHeightInput(composite);
}
private void createWidthInput(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
false));
label.setText(PropertyMessages.ImageWidth_label);
widthInput = new MButton(parent, MButton.NO_IMAGE);
widthInput.getControl().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, false));
widthInput.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
showSizeInput(widthInput.getControl());
}
});
}
private void createHeightInput(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
false));
label.setText(PropertyMessages.ImageHeight_label);
heightInput = new MButton(parent, MButton.NO_IMAGE);
heightInput.getControl().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, false));
heightInput.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
showSizeInput(heightInput.getControl());
}
});
}
private void showSizeInput(Control hostControl) {
new InplaceSizeInput(hostControl).open();
}
private void createResetSizeButton(Composite parent) {
resetSizeButton = new Hyperlink(parent, SWT.NONE);
resetSizeButton.setHref(this);
resetSizeButton.setText(PropertyMessages.ResetImageSize_text);
resetSizeButton.setForeground(parent.getDisplay().getSystemColor(
SWT.COLOR_BLUE));
resetSizeButton.addHyperlinkListener(new IHyperlinkListener() {
public void linkActivated(HyperlinkEvent e) {
resetImageSize();
}
public void linkEntered(HyperlinkEvent e) {
resetSizeButton.setUnderlined(true);
}
public void linkExited(HyperlinkEvent e) {
resetSizeButton.setUnderlined(false);
}
});
}
protected void doRefresh() {
IImage image = getImageModel();
IImagePart part = getPart(image);
boolean defaultWidth = false;
boolean defaultHeight = false;
if (widthInput != null && !widthInput.getControl().isDisposed()) {
int width = image.getWidth();
if (width == IImage.UNSPECIFIED) {
defaultWidth = true;
if (part != null) {
width = part.getFigure().getBounds().width;
}
}
if (width == IImage.UNSPECIFIED) {
width = 0;
}
widthInput.setText(String.valueOf(width));
}
if (heightInput != null && !heightInput.getControl().isDisposed()) {
int height = image.getHeight();
if (height == IImage.UNSPECIFIED) {
defaultHeight = true;
if (part != null) {
height = part.getFigure().getBounds().height;
}
}
if (height == IImage.UNSPECIFIED)
height = 0;
heightInput.setText(String.valueOf(height));
}
resetSizeButton.setEnabled(!defaultWidth || !defaultHeight);
}
private IImagePart getPart(IImage model) {
IGraphicalViewer viewer = getActiveViewer();
if (viewer != null) {
IPart p = viewer.findPart(model);
if (p instanceof IImagePart)
return (IImagePart) p;
}
return null;
}
private IImage getImageModel() {
Object[] elements = getSelectedElements();
if (elements.length > 0 && elements[0] instanceof IImage)
return (IImage) elements[0];
return null;
}
protected void registerEventListener(Object source,
ICoreEventRegister register) {
register.register(Core.ImageWidth);
register.register(Core.ImageHeight);
}
public void setFocus() {
if (widthInput != null && !widthInput.getControl().isDisposed())
widthInput.getControl().setFocus();
}
private void resetImageSize() {
getActiveDomain().handleRequest(
new Request(GEF.REQ_RESIZE).setViewer(getActiveViewer())
.setParameter(GEF.PARAM_SIZE, null));
}
private void modifySize(int width, int height) {
getActiveDomain().handleRequest(
new Request(GEF.REQ_RESIZE).setViewer(getActiveViewer())
.setParameter(GEF.PARAM_SIZE,
new Dimension(width, height)));
}
}