/****************************************************************************
* Copyright (c) 2008, 2009 Jeremy Dowdall
* 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:
* Jeremy Dowdall <jeremyd@aspencloud.com> - initial API and implementation
*****************************************************************************/
package org.eclipse.nebula.cwt.v;
import java.lang.reflect.Constructor;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class VNative<T extends Control> extends VControl {
public static <T extends Control> VNative<T> create(Class<T> type, VPanel parent, int style) {
try {
Constructor<T> constructor = type.getConstructor(Composite.class, int.class);
T control = constructor.newInstance(parent.getComposite(), style);
VNative<T> vn = new VNative<T>(parent, style);
vn.setControl(control);
return vn;
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
T control;
private DisposeListener disposeListener;
private VNative(VPanel panel, int style) {
super(panel, style);
disposeListener = new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dispose();
}
};
}
@Override
void attachListeners(boolean key) {
// skip
}
@Override
void detachListeners(boolean key) {
// skip
}
private boolean checkControl() {
return control != null && !control.isDisposed();
}
@Override
public Point computeSize(int hint, int hint2, boolean changed) {
return control.computeSize(hint, hint2, changed);
}
@Override
public void dispose() {
super.dispose();
if(control != null && !control.isDisposed()) {
control.removeDisposeListener(disposeListener);
control.dispose();
}
}
@Override
public Rectangle getClientArea() {
if(control instanceof Composite) {
return ((Composite) control).getClientArea();
} else {
return super.getClientArea();
}
}
public T getControl() {
return control;
}
@Override
public String getText() {
try {
return (String) control.getClass().getMethod("getText").invoke(control);
} catch (Exception e) {
e.printStackTrace();
return super.getText();
}
}
@Override
public Type getType() {
return Type.Native;
}
@Override
public void setBackground(Color color) {
super.setBackground(color);
if(checkControl()) {
control.setBackground(color);
}
}
@Override
public void setBounds(int x, int y, int width, int height) {
super.setBounds(x, y, width, height);
control.setBounds(x, y, width, height);
}
private void setControl(T control) {
if(this.control != null) {
throw new UnsupportedOperationException("Can only set a control once"); //$NON-NLS-1$
}
this.control = control;
control.addDisposeListener(disposeListener);
control.setData("cwt_vcontrol", this);
// VTracker.addNative(this);
}
@Override
public boolean setFocus() {
return control.setFocus();
}
@Override
public void setFont(Font font) {
control.setFont(font);
}
@Override
public void setForeground(Color color) {
super.setForeground(color);
if(checkControl()) {
control.setForeground(color);
}
}
@Override
public void setText(String text) {
try {
control.getClass().getMethod("setText", String.class).invoke(control, text);
} catch (Exception e) {
e.printStackTrace();
super.setText(text);
}
}
@Override
public void setToolTipText(String text) {
control.setToolTipText(text);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
control.setVisible(visible);
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode()) + " {" + control.toString() + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}