org.eclipse.scout.rt.ui.swt.window.desktop.view.AbstractScoutView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.scout.rt.ui.swt.window.desktop.view.AbstractScoutView.java

Source

/*******************************************************************************
 * Copyright (c) 2010 BSI Business Systems Integration AG.
 * 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:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.rt.ui.swt.window.desktop.view;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.scout.commons.OptimisticLock;
import org.eclipse.scout.commons.StringUtility;
import org.eclipse.scout.commons.exception.ProcessingException;
import org.eclipse.scout.commons.logger.IScoutLogger;
import org.eclipse.scout.commons.logger.ScoutLogManager;
import org.eclipse.scout.rt.client.ClientSyncJob;
import org.eclipse.scout.rt.client.ui.action.ActionUtility;
import org.eclipse.scout.rt.client.ui.action.tool.IToolButton;
import org.eclipse.scout.rt.client.ui.form.IForm;
import org.eclipse.scout.rt.client.ui.form.fields.IFormField;
import org.eclipse.scout.rt.client.ui.form.fields.button.IButton;
import org.eclipse.scout.rt.ui.swt.ISwtEnvironment;
import org.eclipse.scout.rt.ui.swt.action.SwtScoutToolbarAction;
import org.eclipse.scout.rt.ui.swt.busy.AnimatedBusyImage;
import org.eclipse.scout.rt.ui.swt.form.ISwtScoutForm;
import org.eclipse.scout.rt.ui.swt.util.ScoutFormToolkit;
import org.eclipse.scout.rt.ui.swt.util.SwtUtility;
import org.eclipse.scout.rt.ui.swt.util.listener.PartListener;
import org.eclipse.scout.rt.ui.swt.window.ISwtScoutPart;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.part.ViewPart;

/**
 * <h3>AbstractScoutView</h3> ...
 * 
 * @since 1.0.9 03.07.2008
 */
public abstract class AbstractScoutView extends ViewPart implements ISwtScoutPart, ISaveablePart2 {
    private static final IScoutLogger LOG = ScoutLogManager.getLogger(AbstractScoutView.class);

    private P_ViewListener m_viewListener;
    private final OptimisticLock m_closeLock;
    private final OptimisticLock m_closeFromModel;
    private final OptimisticLock m_layoutLock;

    private Form m_rootForm;
    private Composite m_rootArea;

    private IForm m_scoutForm;

    private final PropertyChangeListener m_formPropertyListener;
    private ISwtScoutForm m_uiForm;

    private AnimatedBusyImage m_busyImage;
    private Image m_titleImageBackup;

    public AbstractScoutView() {
        m_formPropertyListener = new P_ScoutPropertyChangeListener();
        m_closeLock = new OptimisticLock();
        m_closeFromModel = new OptimisticLock();
        m_layoutLock = new OptimisticLock();
    }

    @Override
    protected void setTitleImage(Image titleImage) {
        m_titleImageBackup = titleImage;
        if (m_busyImage == null || !m_busyImage.isBusy()) {
            super.setTitleImage(titleImage);
        }
    }

    @Override
    public void setBusy(boolean b) {
        if (m_busyImage == null || m_busyImage.isBusy() == b) {
            return;
        }
        m_busyImage.setBusy(b);
        if (!b) {
            super.setTitleImage(m_titleImageBackup);
        }
    }

    protected void attatchListeners() {
        if (m_viewListener == null) {
            m_viewListener = new P_ViewListener();
        }
        getSite().getPage().addPartListener(m_viewListener);
    }

    protected void detachListeners() {
        getSite().getPage().removePartListener(m_viewListener);
    }

    @Override
    public void dispose() {
        detachListeners();
        super.dispose();
    }

    public void showForm(IForm scoutForm) throws ProcessingException {
        if (m_scoutForm != null) {
            LOG.warn("The view 'ID=" + getViewSite().getId() + "' is already open. The form '"
                    + scoutForm.getTitle() + " (" + scoutForm.getClass().getName() + ")' can not be opened!");
            detachScout(m_scoutForm);
            m_scoutForm = null;
        }
        m_scoutForm = scoutForm;
        try {
            m_layoutLock.acquire();
            getSwtContentPane().setRedraw(false);
            m_uiForm = getSwtEnvironment().createForm(getSwtContentPane(), scoutForm);
            attachScout(m_scoutForm);
        } finally {
            m_layoutLock.release();
            getSwtContentPane().setRedraw(true);
            getSwtContentPane().layout(true, true);
        }
    }

    @Override
    public void closePart() throws ProcessingException {
        try {
            m_closeFromModel.acquire();
            if (m_closeLock.acquire()) {
                try {
                    getSite().getPage().hideView(AbstractScoutView.this);
                } catch (Exception e) {
                    throw new ProcessingException("could not close view '" + getViewSite().getId() + "'.", e);
                }
            }
            if (m_scoutForm != null) {
                detachScout(m_scoutForm);
                m_scoutForm = null;
            }
        } finally {
            m_closeLock.release();
            m_closeFromModel.release();
        }
    }

    @Override
    public IForm getForm() {
        return m_scoutForm;
    }

    @Override
    public ISwtScoutForm getUiForm() {
        return m_uiForm;
    }

    protected void attachScout(IForm form) {
        updateToolbarActionsFromScout();
        setTitleFromScout(form.getTitle());
        setImageFromScout(form.getIconId());
        setMaximizeEnabledFromScout(form.isMaximizeEnabled());
        setMaximizedFromScout(form.isMaximized());
        setMinimizeEnabledFromScout(form.isMinimizeEnabled());
        setMinimizedFromScout(form.isMinimized());
        boolean closable = false;
        for (IFormField f : form.getAllFields()) {
            if (f.isEnabled() && f.isVisible() && f instanceof IButton) {
                switch (((IButton) f).getSystemType()) {
                case IButton.SYSTEM_TYPE_CLOSE:
                case IButton.SYSTEM_TYPE_CANCEL: {
                    closable = true;
                    break;
                }
                }
            }
            if (closable) {
                break;
            }
        }
        setCloseEnabledFromScout(closable);
        // listeners
        form.addPropertyChangeListener(m_formPropertyListener);
    }

    /**
     *
     */
    protected void updateToolbarActionsFromScout() {
        List<IToolButton> toolbuttons = ActionUtility.visibleNormalizedActions(getForm().getToolButtons());
        if (!toolbuttons.isEmpty()) {
            IToolBarManager toolBarManager = getRootForm().getToolBarManager();
            if (getForm().getToolbarLocation() == IForm.TOOLBAR_VIEW_PART) {
                toolBarManager = getViewSite().getActionBars().getToolBarManager();
            }
            for (IToolButton b : toolbuttons) {
                toolBarManager.add(new SwtScoutToolbarAction(b, getSwtEnvironment(), toolBarManager));
            }
            toolBarManager.update(true);
        }

    }

    protected void detachScout(IForm form) {
        // listeners
        form.removePropertyChangeListener(m_formPropertyListener);
    }

    protected void setImageFromScout(String iconId) {
        IForm form = getForm();
        if (form == null) {
            return;
        }

        Image img = getSwtEnvironment().getIcon(iconId);
        setTitleImage(img);

        String subTitle = form.getSubTitle();
        if (subTitle != null) {
            getSwtForm().setImage(img);
        } else {
            getSwtForm().setImage(null);
        }
    }

    protected void setTitleFromScout(String title) {
        IForm form = getForm();
        if (form == null) {
            return;
        }

        String basicTitle = form.getBasicTitle();
        setPartName(StringUtility.removeNewLines(basicTitle != null ? basicTitle : ""));

        String subTitle = form.getSubTitle();
        if (subTitle != null) {
            getSwtForm().setText(
                    SwtUtility.escapeMnemonics(StringUtility.removeNewLines(subTitle != null ? subTitle : "")));
        } else {
            getSwtForm().setText(null);
        }
    }

    protected void setMaximizeEnabledFromScout(boolean maximizable) {
        // must be done by instantiating
    }

    protected void setMaximizedFromScout(boolean maximized) {
        IWorkbenchPartReference ref = getSite().getPage().getReference(getSite().getPart());
        try {
            if (maximized) {
                getSite().getPage().setPartState(ref, IWorkbenchPage.STATE_MAXIMIZED);
            } else {
                getSite().getPage().setPartState(ref, IWorkbenchPage.STATE_RESTORED);
            }
        } catch (Exception e) {
            // void
        }
    }

    protected void setMinimizeEnabledFromScout(boolean minized) {
        // must be done by instantiating
    }

    protected void setMinimizedFromScout(boolean minimized) {
        // IWorkbenchPartReference ref =
        // getSite().getPage().getReference(getSite().getPart());
        // try {
        // if (maximized) {
        // getSite().getPage().setPartState(ref, IWorkbenchPage.STATE_MAXIMIZED);
        // } else {
        // getSite().getPage().setPartState(ref, IWorkbenchPage.STATE_RESTORED);
        // }
        // } catch (Exception e) {
        // // void
        // }
    }

    protected void setCloseEnabledFromScout(boolean closebale) {
        // void
    }

    @Override
    public void createPartControl(Composite parent) {
        m_busyImage = new AnimatedBusyImage(parent.getDisplay()) {
            @Override
            protected void notifyImage(Image image) {
                AbstractScoutView.super.setTitleImage(image);
            }
        };
        ScoutFormToolkit toolkit = getSwtEnvironment().getFormToolkit();
        m_rootForm = toolkit.createForm(parent);
        m_rootForm.setData(ISwtScoutPart.MARKER_SCOLLED_FORM, new Object());
        m_rootArea = m_rootForm.getBody();
        m_rootArea.setLayout(new ViewStackLayout());
        attatchListeners();
    }

    @Override
    public Form getSwtForm() {
        return m_rootForm;
    }

    protected Form getRootForm() {
        return m_rootForm;
    }

    protected Composite getRootArea() {
        return m_rootArea;
    }

    @Override
    public void setFocus() {
        m_rootArea.setFocus();
    }

    public Composite getSwtContentPane() {
        return m_rootArea;
    }

    /**
     * must be implemented by the concrete view to provide an environment
     * 
     * @return
     */
    protected abstract ISwtEnvironment getSwtEnvironment();

    @Override
    public boolean isVisible() {
        return getSite().getPage().isPartVisible(getSite().getPart());
    }

    @Override
    public void activate() {
        if (getSite().getPage().getViewStack(this) != null) {
            getSite().getPage().activate(getSite().getPart());
        }
    }

    @Override
    public boolean isActive() {
        IWorkbenchWindow w = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        if (w == null) {
            return false;
        }
        IWorkbenchPage activePage = w.getActivePage();
        if (activePage == null) {
            return false;
        }
        return (activePage == getSite().getPage()) && (activePage.getActivePart() == this);
    }

    @Override
    public void setStatusLineMessage(Image image, String message) {
        getViewSite().getActionBars().getStatusLineManager().setMessage(image, message);
    }

    protected void firePartActivatedFromUI() {
        Runnable job = new Runnable() {
            @Override
            public void run() {
                if (m_scoutForm != null) {
                    m_scoutForm.getUIFacade().fireFormActivatedFromUI();
                }
            }
        };
        getSwtEnvironment().invokeScoutLater(job, 0);
    }

    private class P_ViewListener extends PartListener {
        @Override
        public void partActivated(IWorkbenchPartReference partRef) {
            if (partRef.getPart(false).equals(getViewSite().getPart())) {
                if (getSwtEnvironment().isInitialized()) {
                    firePartActivatedFromUI();
                }
            }
        }

        @Override
        public void partClosed(IWorkbenchPartReference partRef) {
            if (getViewSite().getPart().equals(partRef.getPart(false))) {
                try {
                    if (m_closeLock.acquire()) {
                        Runnable job = new Runnable() {
                            @Override
                            public void run() {
                                if (m_scoutForm != null) {
                                    m_scoutForm.getUIFacade().fireFormKilledFromUI();
                                }
                            }
                        };
                        if (getSwtEnvironment().isInitialized()) {
                            getSwtEnvironment().invokeScoutLater(job, 0);
                        }
                    }
                } finally {
                    m_closeLock.release();
                }
            }
        }
    }

    @Override
    public int promptToSaveOnClose() {
        if (m_scoutForm == null) {
            return ISaveablePart2.NO;
        }
        if (m_closeFromModel.isReleased()) {
            new ClientSyncJob("Prompt to save", getSwtEnvironment().getClientSession()) {
                @Override
                protected void runVoid(IProgressMonitor monitor) throws Throwable {
                    if (m_scoutForm != null) {
                        m_scoutForm.getUIFacade().fireFormClosingFromUI();
                    }
                }
            }.schedule();
            return ISaveablePart2.CANCEL;
        }
        return ISaveablePart2.YES;
    }

    @Override
    public void doSave(IProgressMonitor monitor) {
    }

    @Override
    public void doSaveAs() {
    }

    @Override
    public boolean isDirty() {
        if (m_scoutForm != null && m_scoutForm.isAskIfNeedSave()) {
            boolean saveNeeded = m_scoutForm.isSaveNeeded();
            return saveNeeded;
        } else {
            return false;
        }
    }

    @Override
    public boolean isSaveAsAllowed() {
        return false;
    }

    @Override
    public boolean isSaveOnCloseNeeded() {
        // ensure the focus owning field is validated
        Control focusControl = m_rootArea.getDisplay().getFocusControl();
        SwtUtility.runSwtInputVerifier(focusControl);
        return isDirty();
    }

    protected void handleScoutPropertyChange(String name, Object newValue) {
        if (name.equals(IForm.PROP_TITLE)) {
            setTitleFromScout((String) newValue);
        } else if (name.equals(IForm.PROP_ICON_ID)) {
            setImageFromScout((String) newValue);
        } else if (name.equals(IForm.PROP_MINIMIZE_ENABLED)) {
            setMinimizeEnabledFromScout(((Boolean) newValue).booleanValue());
        } else if (name.equals(IForm.PROP_MAXIMIZE_ENABLED)) {
            setMaximizeEnabledFromScout(((Boolean) newValue).booleanValue());
        } else if (name.equals(IForm.PROP_MINIMIZED)) {
            setMinimizedFromScout(((Boolean) newValue).booleanValue());
        } else if (name.equals(IForm.PROP_MAXIMIZED)) {
            setMaximizedFromScout(((Boolean) newValue).booleanValue());
        } else if (name.equals(IForm.PROP_SAVE_NEEDED)) {
            firePropertyChange(PROP_DIRTY);
        }
    }

    private class P_ScoutPropertyChangeListener implements PropertyChangeListener {
        @Override
        public void propertyChange(final PropertyChangeEvent e) {
            Runnable t = new Runnable() {
                @Override
                public void run() {
                    handleScoutPropertyChange(e.getPropertyName(), e.getNewValue());
                }
            };
            getSwtEnvironment().invokeSwtLater(t);
        }
    }// end private class

}