/* * Copyright (c) 2011, M. Woelker, H. Westphal * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of jo-widgets.org nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.jowidgets.workbench.impl.rcp.internal; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.jowidgets.api.model.item.IMenuBarModel; import org.jowidgets.api.model.item.IToolBarModel; import org.jowidgets.api.toolkit.Toolkit; import org.jowidgets.api.widgets.IContainer; import org.jowidgets.api.widgets.IFrame; import org.jowidgets.api.widgets.IToolBar; import org.jowidgets.api.widgets.blueprint.factory.IBluePrintFactory; import org.jowidgets.common.types.Dimension; import org.jowidgets.common.widgets.layout.MigLayoutDescriptor; import org.jowidgets.tools.types.VetoHolder; import org.jowidgets.workbench.api.ITrayItem; import org.jowidgets.workbench.api.IWorkbench; import org.jowidgets.workbench.impl.rcp.internal.util.ImageHelper; public final class JoWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { private final IWorkbench workbench; private final WorkbenchContext context; private IFrame frame; private IContainer statusBar; private ITrayItem tray; private IMenuBarModel menuBarModel; private IToolBar toolBar; private IToolBarModel toolBarModel; private WorkbenchApplicationFolder applicationFolder; private double folderRatio = 0.2; private String[] selectedTreeNode; public JoWorkbenchWindowAdvisor( final IWorkbenchWindowConfigurer configurer, final IWorkbench workbench, final WorkbenchContext context) { super(configurer); this.workbench = workbench; this.context = context; } public IContainer getStatusBar() { if (statusBar == null) { frame.layoutBegin(); statusBar = frame.add(Toolkit.getBluePrintFactory().composite(), "growx"); frame.layoutEnd(); } return statusBar; } public ITrayItem getTrayItem() { if (tray == null && frame != null) { tray = new WorkbenchTrayItem(frame, workbench); } return tray; } public WorkbenchApplicationFolder getApplicationFolder() { return applicationFolder; } @Override public void preWindowOpen() { final IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); final Dimension initialDimension = workbench.getInitialDimension(); if (initialDimension != null) { configurer.setInitialSize(new Point(initialDimension.getWidth(), initialDimension.getHeight())); } configurer.setTitle(workbench.getLabel()); } @Override public void postWindowOpen() { final IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); if (workbench.isInitialMaximized()) { configurer.getWindow().getShell().setMaximized(true); } } @Override public boolean preWindowShellClose() { final VetoHolder vetoHolder = new VetoHolder(); workbench.onClose(vetoHolder); return !vetoHolder.hasVeto(); } @Override public void postWindowClose() { workbench.onDispose(); } @Override public void createWindowContents(final Shell shell) { shell.setImage(ImageHelper.getImage(workbench.getIcon(), null)); frame = Toolkit.getWidgetWrapperFactory().createFrame(shell); final IBluePrintFactory bpf = Toolkit.getBluePrintFactory(); if (workbench.hasApplicationNavigator()) { frame.setLayout(new MigLayoutDescriptor("3[grow]3", "0[]0[][grow][]0")); } else { frame.setLayout(new MigLayoutDescriptor("3[grow]3", "0[]0[][]0[grow][]0")); } // dummy coolbar control final Control coolBar = getWindowConfigurer().createCoolBarControl(shell); coolBar.setEnabled(false); coolBar.setVisible(false); coolBar.setLayoutData("wrap"); toolBar = frame.add(bpf.toolBar(), "hidemode 2, wrap"); toolBar.setVisible(false); final IContainer appFolderContainer; final IContainer pageContainer; final SashForm sashForm; if (workbench.hasApplicationNavigator()) { sashForm = new SashForm(shell, SWT.HORIZONTAL); sashForm.setLayoutData("wmin 0, hmin 0, grow, wrap"); sashForm.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(final DisposeEvent e) { // save sash weight before it is disposed folderRatio = sashForm.getWeights()[0] / 1000.0; } }); appFolderContainer = Toolkit.getWidgetWrapperFactory().createComposite(new Composite(sashForm, SWT.NONE)); appFolderContainer.setLayout(new MigLayoutDescriptor("0[grow]0", "0[grow]0")); pageContainer = Toolkit.getWidgetWrapperFactory().createComposite(new Composite(sashForm, SWT.NONE)); pageContainer.setLayout(new MigLayoutDescriptor("0[grow]0", "0[grow]0")); } else { appFolderContainer = frame; pageContainer = frame; sashForm = null; } applicationFolder = new WorkbenchApplicationFolder((Composite) appFolderContainer.getUiReference(), workbench, context); if (workbench.hasApplicationNavigator()) { applicationFolder.setLayoutData("wmin 0, hmin 0, grow"); } else { applicationFolder.setLayoutData("hidemode 2, wrap"); applicationFolder.setVisible(false); } applicationFolder.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(final DisposeEvent e) { selectedTreeNode = applicationFolder.getSelectedTreeNode(); } }); final Control pageComposite = getWindowConfigurer().createPageComposite((Composite) pageContainer.getUiReference()); pageComposite.setLayoutData("wmin 0, hmin 0, grow"); if (sashForm != null) { sashForm.setWeights(new int[] {(int) (folderRatio * 1000), (int) ((1 - folderRatio) * 1000)}); } } public double getFolderRatio() { return folderRatio; } public void setFolderRatio(final double folderRatio) { this.folderRatio = folderRatio; } public String[] getSelectedTreeNode() { return selectedTreeNode; } public void selectTreeNode(final String[] selectedTreeNode) { this.selectedTreeNode = selectedTreeNode; if (applicationFolder != null && !applicationFolder.isDisposed()) { applicationFolder.selectTreeNode(selectedTreeNode); } } public IToolBarModel getToolBar() { if (toolBarModel == null && toolBar != null) { toolBarModel = Toolkit.getModelFactoryProvider().getItemModelFactory().toolBar(); toolBar.setModel(toolBarModel); frame.layoutBegin(); toolBar.setVisible(true); frame.layoutEnd(); } return toolBarModel; } public IMenuBarModel getMenuBar() { if (menuBarModel == null && frame != null) { menuBarModel = Toolkit.getModelFactoryProvider().getItemModelFactory().menuBar(); frame.createMenuBar().setModel(menuBarModel); } return menuBarModel; } }