package com.yoursway.ide.application.view.impl;
import static com.yoursway.swt.additions.FormDataBuilder.formDataOf;
import static com.yoursway.swt.additions.YsSwtUtils.centerShellOnNearestMonitor;
import org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
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.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.yoursway.ide.application.view.View;
import com.yoursway.ide.application.view.ViewCallback;
import com.yoursway.ide.application.view.ViewDefinition;
import com.yoursway.ide.application.view.ViewDefinitionFactory;
import com.yoursway.ide.application.view.mainwindow.EditorWindow;
import com.yoursway.ide.application.view.mainwindow.EditorWindowCallback;
import com.yoursway.ide.application.view.mainwindow.EditorWindowModel;
import com.yoursway.ide.application.view.mainwindow.MainWindow;
import com.yoursway.ide.application.view.mainwindow.MainWindowArea;
import com.yoursway.ide.application.view.mainwindow.MainWindowAreas;
import com.yoursway.ide.application.view.mainwindow.MainWindowCallback;
import com.yoursway.ide.application.view.mainwindow.MainWindowModel;
import com.yoursway.ide.application.view.mainwindow.MainWindowViewAreaVisitor;
import com.yoursway.swt.additions.YsStandardFonts;
public class MainWindowImpl implements MainWindow {
private final MainWindowCallback callback;
private final MainWindowModel windowModel;
private Shell shell;
private Composite projectComposite;
private CTabFolder tabFolder;
private final ViewDefinitionFactory viewDefinitions;
private Composite birdsEyeViewComposite;
public MainWindowImpl(Display display, final MainWindowModel windowModel, MainWindowCallback callback,
ViewDefinitionFactory viewDefinitions, ApplicationMenuFactory menuFactory) {
if (display == null)
throw new NullPointerException("display is null");
if (windowModel == null)
throw new NullPointerException("windowModel is null");
if (callback == null)
throw new NullPointerException("callback is null");
if (viewDefinitions == null)
throw new NullPointerException("viewDefinitions is null");
this.windowModel = windowModel;
this.callback = callback;
this.viewDefinitions = viewDefinitions;
shell = new Shell(display);
shell.setData(this);
shell.setLayout(new FormLayout());
if (menuFactory != null)
shell.setMenuBar(menuFactory.createMenuFor(shell, callback));
projectComposite = new Composite(shell, SWT.NONE);
formDataOf(projectComposite).left(0).right(0, 220).top(0).bottom(100, -150);
birdsEyeViewComposite = new Composite(shell, SWT.NONE);
formDataOf(birdsEyeViewComposite).left(0).right(projectComposite, 0, SWT.RIGHT).top(projectComposite)
.bottom(100);
tabFolder = new CTabFolder(shell, SWT.TOP | SWT.CLOSE);
// tabFolder = new TabFolder(shell, SWT.TOP);
formDataOf(tabFolder).left(projectComposite).right(100).top(0).bottom(100);
tabFolder.setTabHeight(16); // 16px should be enough for everyone
tabFolder.setFont(YsStandardFonts.miniFont());
tabFolder.setMRUVisible(false); // no-no-no, David Blane, no-no-no
tabFolder.setSimple(true); // no fancy space-eating curves
hookEverything(windowModel);
// TODO: remember which monitor the window was in, and reopen it there
Rectangle bounds = display.getPrimaryMonitor().getBounds();
shell.setSize(bounds.width * 2 / 3, bounds.height * 2 / 3);
}
private void hookEverything(final MainWindowModel windowModel) {
new ControlUpdater(shell) {
protected void updateControl() {
shell.setText(windowModel.projectLocation().getValue() + " - "
+ windowModel.projectType().getValue().getDescriptiveName());
shell.layout();
}
};
shell.addShellListener(new ShellAdapter(){
public void shellActivated(ShellEvent e) {
callback.activated();
}
public void shellDeactivated(ShellEvent e) {
callback.deactivated();
}
});
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
callback.windowDisposed();
}
});
}
public MainWindowAreas definition() {
return null;
}
public View bindView(ViewDefinition definition, final ViewCallback callback) {
class Visitor implements MainWindowViewAreaVisitor {
public View result = null;
public void visitGeneralArea() {
}
public void visitProjectViewArea() {
result = new CompositeView(projectComposite, callback);
}
public void visitBirdsEyeViewArea() {
result = new CompositeView(birdsEyeViewComposite, callback);
}
};
MainWindowArea area = (MainWindowArea) definition.area();
Visitor visitor = new Visitor();
area.accept(visitor);
return visitor.result;
}
public void open() {
centerShellOnNearestMonitor(shell);
shell.open();
}
public EditorWindow createEditorWindow(EditorWindowModel model, EditorWindowCallback callback) {
return new EditorWindowImpl(model, callback, tabFolder);
}
public void forceClose() {
shell.dispose();
}
}