package ConnectivityEditor.Window;
import static javax.media.opengl.fixedfunc.GLMatrixFunc.GL_MODELVIEW;
import static javax.media.opengl.fixedfunc.GLMatrixFunc.GL_PROJECTION;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
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.Display;
import org.eclipse.swt.widgets.Shell;
import Builder.BuilderConfigurationManager;
import Builder.DragSelectionInfoRenderer;
import Builder.MainCamera;
import Builder.MetaInfoRenderer;
import Command.LDrawPart;
import Common.Size2;
import Common.Vector3f;
import ConnectivityEditor.Connectivity.ConnectivityRendererForConnectivityEditor;
import ConnectivityEditor.ConnectivityControlGuide.ConnectivityMovementGuideRenderer;
import LDraw.Support.LDrawGLRenderer;
import Resource.ResourceManager;
import com.jogamp.opengl.swt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;
public class ConnectivityEditorUI implements GLEventListener {
FPSAnimator animator;
LDrawGLRenderer glRenderer;
MetaInfoRenderer metaInfoRenderer;
ConnectivityMovementGuideRenderer connectivityMovementGuideRenderer;
ConnectivityRendererForConnectivityEditor connectivityRenderer;
ConnectivityBrowserUI browserUI;
FileInfoTreeViewForConnectivityEditor fileInfoTreeView;
// FileInfoUI fileInfoUI;
GLCanvas glcanvas;
MainCamera camera;
ConnectivityEditor connectivityEditor = null;
DragSelectionInfoRenderer brickSelectionInfoRenderer;
StatusBarForConnectivityEditor statusBar;
Shell shell;
SashForm sashForm;
Composite mainView;
private static ConnectivityEditorUI _instance = null;
public synchronized static ConnectivityEditorUI getInstance(String partName) {
if (_instance == null){
_instance = new ConnectivityEditorUI();
_instance.open(partName);
}else{
ConnectivityEditor.getInstance().openFile(partName);
}
return _instance;
}
private ConnectivityEditorUI() {
this.connectivityEditor = ConnectivityEditor.getInstance();
}
private void open(String partName) {
Display display = Display.getDefault();
shell = new Shell(display);
shell.setText(ConnectivityEditor.APP_NAME);
BuilderConfigurationManager configurationManager = BuilderConfigurationManager.getInstance();
shell.setSize((int) configurationManager.getWindowSize().getWidth(),
(int) configurationManager.getWindowSize().getHeight());
shell.setLocation(new Point((int) configurationManager
.getWindowPosition().getX(), (int) configurationManager
.getWindowPosition().getY()));
shell.addShellListener(new ShellAdapter() {
@Override
public void shellClosed(ShellEvent event) {
if (!connectivityEditor.checkChanged(shell)) {
event.doit = false;
}
super.shellClosed(event);
}
});
shell.setImage(ResourceManager.getInstance().getImage(display,
"/Resource/Image/bl_new_icon.png"));
shell.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent arg0) {
if (shell.getMaximized() || shell.getMinimized())
return;
fileInfoTreeView.terminate();
animator.stop();
statusBar.dispose();
}
});
camera = connectivityEditor.getCamera();
// generate window component
generateComposite();
shell.open();
GlobalFocusManagerForConnectivityEditor.getInstance()
.forceFocusToMainView();
connectivityEditor.openFile(partName);
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
browserUI.close();
fileInfoTreeView.terminate();
_instance=null;
}
private void generateComposite() {
shell.setLayout(new GridLayout(1, false));
// Menu bar
new MenuHandlerForConnectivityEditor(connectivityEditor, shell)
.generateMenu();
// Toolbar
new ToolBarHandlerForConnectivityEditor(connectivityEditor, shell)
.generateToolbar();
sashForm = new SashForm(shell, SWT.NONE);
sashForm.setLocation(10, 40);
sashForm.setSashWidth(5);
sashForm.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
| GridData.FILL_VERTICAL));
browserUI = new ConnectivityBrowserUI(sashForm, SWT.NONE);
mainView = new Composite(sashForm, SWT.NONE);
mainView.setLayout(new FillLayout());
mainView.setBounds(10, 40, 728, 519);
GLProfile glprofile = GLProfile.getDefault();
GLCapabilities glcapabilities = new GLCapabilities(glprofile);
glcanvas = new GLCanvas(mainView, SWT.NO_BACKGROUND, glcapabilities,
null);
initEventListener();
animator = new FPSAnimator(glcanvas, 30);
GlobalFocusManagerForConnectivityEditor.getInstance(glcanvas);
// FileInfoTreeView
fileInfoTreeView = new FileInfoTreeViewForConnectivityEditor(
connectivityEditor);
fileInfoTreeView.generateView(sashForm);
setDragTarget(mainView);
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
statusBar = new StatusBarForConnectivityEditor(
shell, SWT.BORDER, connectivityEditor);
statusBar.setLayoutData(gridData);
}
public void setDragTarget(Control control) {
final TextTransfer textTransfer = TextTransfer.getInstance();
final FileTransfer fileTransfer = FileTransfer.getInstance();
DropTarget target = new DropTarget(control, DND.DROP_COPY
| DND.DROP_MOVE | DND.DROP_DEFAULT);
target.setTransfer(new Transfer[] { fileTransfer, textTransfer });
target.addDropListener(new DropTargetListener() {
LDrawPart part;
@Override
public void dropAccept(DropTargetEvent event) {
}
@Override
public void drop(DropTargetEvent event) {
mainView.setFocus();
}
@Override
public void dragOver(DropTargetEvent event) {
if (part != null) {
Point coordinates = mainView.toControl(new Point(event.x,
event.y));
GlobalMousePositionForConnectivityEditor.getInstance()
.setPos(coordinates.x, coordinates.y);
Vector3f hitPos = connectivityEditor.getHittedPos(
coordinates.x, coordinates.y, true);
}
}
@Override
public void dragOperationChanged(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT) {
if ((event.operations & DND.DROP_COPY) != 0) {
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
if (fileTransfer.isSupportedType(event.currentDataType)) {
if (event.detail != DND.DROP_COPY) {
event.detail = DND.DROP_NONE;
}
}
}
@Override
public void dragLeave(DropTargetEvent event) {
if (part != null) {
}
event.operations = DND.DROP_NONE;
event.detail = DND.DROP_NONE;
}
@Override
public void dragEnter(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT) {
if ((event.operations & DND.DROP_COPY) != 0) {
event.detail = DND.DROP_COPY;
} else {
event.detail = DND.DROP_NONE;
}
}
for (TransferData data : event.dataTypes) {
if (fileTransfer.isSupportedType(data)) {
event.currentDataType = data;
if (event.detail != DND.DROP_COPY) {
event.detail = DND.DROP_NONE;
}
return;
}
}
if (textTransfer.isSupportedType(event.currentDataType)) {
event.detail = DND.DROP_NONE;
}
}
});
}
@Override
public void dispose(GLAutoDrawable glautodrawable) {
animator.stop();
}
@Override
public void init(GLAutoDrawable glautodrawable) {
GL2 gl2 = (GL2) glautodrawable.getGL(); // get the OpenGL graphics
gl2.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0);
// gl2.glBindVertexArray(0);
// init gl related component
glRenderer = connectivityEditor.getGLRenderer();
metaInfoRenderer = connectivityEditor.getMetaInfoRenderer();
connectivityMovementGuideRenderer = connectivityEditor
.getConnMovementGuideRenderer();
connectivityRenderer = connectivityEditor.getConnectivityRenderer();
brickSelectionInfoRenderer = connectivityEditor
.getConnSelectionInfoRenderer();
connectivityEditor.initGLReleatedComponent(new Size2(800f, 600f), gl2);
animator.start();
}
@Override
public void display(GLAutoDrawable glautodrawable) {
GL2 gl2 = (GL2) glautodrawable.getGL(); // get the OpenGL graphics
gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl2.glLoadIdentity(); // Reset The Modelview Matrix
// long t = System.nanoTime();
glRenderer.draw(gl2);
// System.out.println((System.nanoTime()-t)/1000000.0f);
metaInfoRenderer.draw(gl2);
connectivityMovementGuideRenderer.draw(gl2);
connectivityRenderer.draw(gl2);
camera.tickle();
brickSelectionInfoRenderer.draw(gl2);
}
@Override
public void reshape(GLAutoDrawable glautodrawable, int x, int y, int width,
int height) {
GL2 gl = (GL2) glautodrawable.getGL(); // get the OpenGL graphics
// context
if (height == 0)
height = 1; // prevent divide by zero
camera.setScreenSize(width, height);
// Set the view port (display area) to cover the entire window
gl.glViewport(0, 0, width, height);
// Setup perspective projection, with aspect ratio matches viewport
gl.glMatrixMode(GL_PROJECTION); // choose projection matrix
gl.glLoadIdentity(); // reset projection matrix
// Enable the model-view transform
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity(); // reset
gl.glEnable(GL2.GL_BLEND);
gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);
// gl.glEnable(GL2.GL_COLOR_MATERIAL);
brickSelectionInfoRenderer.setCanvasSize(width, height);
}
private void initEventListener() {
ConnectivityEditorEventHandler eventHandler = new ConnectivityEditorEventHandler(
connectivityEditor);
glcanvas.addMouseListener(eventHandler);
glcanvas.addMouseMoveListener(eventHandler);
glcanvas.addMouseWheelListener(eventHandler);
glcanvas.addMouseTrackListener(eventHandler);
// init keyboard event handler for test
glcanvas.addKeyListener(eventHandler);
glcanvas.addGLEventListener(this);
}
}