package org.archstudio.eclipse.ui.views;
import org.archstudio.myx.fw.IMyxBrick;
import org.archstudio.myx.fw.IMyxName;
import org.archstudio.myx.fw.IMyxRegistryListener;
import org.archstudio.myx.fw.MyxRegistry;
import org.archstudio.myx.fw.MyxRegistryEvent;
import org.archstudio.swtutils.SWTWidgetUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;
public abstract class AbstractArchStudioAsyncView<B extends IMyxBrick> extends ViewPart implements IMyxRegistryListener {
protected B brick = null;
private final Class<B> brickClass;
private final IMyxName brickName;
private Composite parent = null;
private boolean parentCreated = false;
private final MyxRegistry myxRegistry = MyxRegistry.getSharedInstance();
public AbstractArchStudioAsyncView(Class<B> brickClass) {
this.brickClass = brickClass;
this.brickName = null;
myxRegistry.addMyxRegistryListener(this);
}
public AbstractArchStudioAsyncView(IMyxName brickName) {
this.brickClass = null;
this.brickName = brickName;
myxRegistry.addMyxRegistryListener(this);
}
@Override
final public void createPartControl(Composite parent) {
new Label(parent, SWT.NONE).setText("Initializing ArchStudio...");
this.parent = parent;
checkInitialization();
}
abstract public void createMyxPartControl(Composite parent);
@Override
final public void setFocus() {
if (parentCreated) {
setMyxFocus();
}
}
abstract public void setMyxFocus();
@Override
@SuppressWarnings("unchecked")
public void handleMyxRegistryEvent(MyxRegistryEvent evt) {
if (evt.getEventType() == MyxRegistryEvent.EventType.BRICK_REGISTERED) {
if (brickClass != null && brickClass.getName().equals(evt.getBrick().getClass().getName())) {
this.brick = (B) evt.getBrick();
SWTWidgetUtils.async(parent, new Runnable() {
@Override
public void run() {
checkInitialization();
}
});
}
if (brickName != null && brickName.equals(evt.getBrick().getMyxBrickItems().getBrickName())) {
this.brick = (B) evt.getBrick();
SWTWidgetUtils.async(parent, new Runnable() {
@Override
public void run() {
checkInitialization();
}
});
}
}
}
private void checkInitialization() {
if (parent != null && !parent.isDisposed()) {
if (brick == null) {
brick = myxRegistry.getBrick(brickClass);
}
if (brick != null && !parentCreated) {
parentCreated = true;
for (Control control : parent.getChildren()) {
control.dispose();
}
initializeMyxBrick();
createMyxPartControl(parent);
parent.layout();
}
}
}
protected void initializeMyxBrick() {
}
}