org.kalypso.commons.databinding.swt.FileBinding.java Source code

Java tutorial

Introduction

Here is the source code for org.kalypso.commons.databinding.swt.FileBinding.java

Source

/*----------------    FILE HEADER KALYPSO ------------------------------------------
 *
 *  This file is part of kalypso.
 *  Copyright (C) 2004 by:
 *
 *  Technical University Hamburg-Harburg (TUHH)
 *  Institute of River and coastal engineering
 *  Denickestrae 22
 *  21073 Hamburg, Germany
 *  http://www.tuhh.de/wb
 *
 *  and
 *
 *  Bjoernsen Consulting Engineers (BCE)
 *  Maria Trost 3
 *  56070 Koblenz, Germany
 *  http://www.bjoernsen.de
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact:
 *
 *  E-Mail:
 *  belger@bjoernsen.de
 *  schlienger@bjoernsen.de
 *  v.doemming@tuhh.de
 *
 *  ---------------------------------------------------------------------------*/
package org.kalypso.commons.databinding.swt;

import java.io.File;

import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.kalypso.commons.databinding.DataBinder;
import org.kalypso.commons.databinding.IDataBinding;
import org.kalypso.commons.databinding.conversion.FileToStringConverter;
import org.kalypso.commons.databinding.conversion.StringToFileConverter;
import org.kalypso.commons.internal.i18n.Messages;
import org.kalypso.contribs.eclipse.jface.wizard.IFileChooserDelegate;

/**
 * @author Gernot Belger
 */
public class FileBinding {
    private final IDataBinding m_binding;

    private final IObservableValue m_fileValue;

    private final IFileChooserDelegate m_delegate;

    public FileBinding(final IDataBinding binding, final IObservableValue fileValue,
            final IFileChooserDelegate delegate) {
        m_binding = binding;
        m_fileValue = fileValue;
        m_delegate = delegate;
    }

    public Text createFileField(final Composite parent) {
        final Text field = new Text(parent, SWT.SINGLE | SWT.BORDER);
        field.setFont(parent.getFont());

        final IObservableValue targetFile = SWTObservables.observeText(field, SWT.Modify);

        final DataBinder binder = new DataBinder(targetFile, m_fileValue);
        binder.setModelToTargetConverter(new FileToStringConverter());
        binder.setTargetToModelConverter(new StringToFileConverter());

        binder.addTargetAfterConvertValidator(new FileChooserValidator(m_delegate));

        m_binding.bindValue(binder);

        return field;
    }

    /**
     * Create a text editor for a file path. The editor is a combo box, that also shows the recent history of edited file
     * pathes.
     * 
     * @param historyValue
     *          The value representing the history of directories. Must be of type String[].
     */
    public Control createFileFieldWithHistory(final Composite parent, final IObservableValue historyValue) {
        Assert.isTrue(historyValue.getValueType() == String[].class);

        final ComboViewer viewer = new ComboViewer(parent, SWT.SINGLE | SWT.BORDER | SWT.DROP_DOWN);
        viewer.getControl().setFont(parent.getFont());
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(new LabelProvider());

        final IObservableValue targetInput = ViewersObservables.observeInput(viewer);
        m_binding.bindValue(targetInput, historyValue);

        final ISWTObservableValue targetText = SWTObservables.observeText(viewer.getControl());
        final DataBinder binder = new DataBinder(targetText, m_fileValue);
        binder.setModelToTargetConverter(new FileToStringConverter());
        binder.setTargetToModelConverter(new StringToFileConverter());

        binder.addTargetAfterConvertValidator(new FileChooserValidator(m_delegate));

        m_binding.bindValue(binder);

        return viewer.getControl();
    }

    public Button createFileSearchButton(final Composite parent, final Control fileTextControl) {
        // destination browse button
        final Button browseButton = new Button(parent, SWT.PUSH);
        browseButton.setText(Messages.getString("FileBinding_0")); //$NON-NLS-1$
        browseButton.setFont(parent.getFont());

        browseButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleBrowseButtonSelected(parent.getShell(), fileTextControl);
            }
        });

        return browseButton;
    }

    protected void handleBrowseButtonSelected(final Shell shell, final Control fileTextControl) {
        final File currentfile = (File) m_fileValue.getValue();
        final File newFile = m_delegate.chooseFile(shell, currentfile);
        if (newFile == null)
            return;

        final String newPath = newFile.getAbsolutePath();
        DirectoryValueSelectionListener.setValue(fileTextControl, newPath);
    }
}