Package bndtools.editor.common

Source Code of bndtools.editor.common.PropertyTableSectionPart

package bndtools.editor.common;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

import aQute.bnd.build.model.BndEditModel;

public abstract class PropertyTableSectionPart extends SectionPart implements PropertyChangeListener {

    private final String propertyName;
    private Map<String,String> properties;
    private BndEditModel model;

    private Table table;
    private TableViewer viewer;
    private MapEntryCellModifier<String,String> modifierProperties;

    public PropertyTableSectionPart(String propertyName, Composite parent, FormToolkit toolkit, int style) {
        super(parent, toolkit, style);
        this.propertyName = propertyName;

        createSection(getSection(), toolkit);
    }

    void createSection(Section section, FormToolkit toolkit) {
        // Toolbar buttons
        ToolBar toolbar = new ToolBar(section, SWT.FLAT);
        section.setTextClient(toolbar);
        final ToolItem addItem = new ToolItem(toolbar, SWT.PUSH);
        addItem.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ADD));
        addItem.setToolTipText("Add Bundle");

        final ToolItem removeItem = new ToolItem(toolbar, SWT.PUSH);
        removeItem.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE));
        removeItem.setDisabledImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE_DISABLED));
        removeItem.setToolTipText("Remove");
        removeItem.setEnabled(false);

        Composite composite = toolkit.createComposite(section);
        section.setClient(composite);

        table = toolkit.createTable(composite, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER);
        viewer = new TableViewer(table);
        modifierProperties = new MapEntryCellModifier<String,String>(viewer);

        table.setHeaderVisible(true);
        table.setLinesVisible(false);

        modifierProperties.addColumnsToTable();

        viewer.setUseHashlookup(true);
        viewer.setColumnProperties(MapEntryCellModifier.getColumnProperties());
        modifierProperties.addCellEditorsToViewer();
        viewer.setCellModifier(modifierProperties);

        viewer.setContentProvider(new MapContentProvider());
        viewer.setLabelProvider(new PropertiesTableLabelProvider());

        // Layout
        GridLayout layout = new GridLayout(1, false);
        layout.horizontalSpacing = 0;
        layout.verticalSpacing = 0;
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        composite.setLayout(layout);

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
        gd.heightHint = 100;
        gd.widthHint = 50;
        table.setLayoutData(gd);

        // Listeners
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                removeItem.setEnabled(!viewer.getSelection().isEmpty());
            }
        });
        addItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doAddProperty();
            }
        });
        removeItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doRemoveProperty();
            }
        });
        modifierProperties.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                markDirty();
            }
        });
    }

    void doAddProperty() {
        properties.put("name", "");
        viewer.add("name");
        markDirty();

        viewer.editElement("name", 0);
    }

    void doRemoveProperty() {
        @SuppressWarnings("rawtypes")
        Iterator iter = ((IStructuredSelection) viewer.getSelection()).iterator();
        while (iter.hasNext()) {
            Object item = iter.next();
            properties.remove(item);
            viewer.remove(item);
        }
        markDirty();
    }

    @Override
    public void initialize(IManagedForm form) {
        super.initialize(form);

        model = (BndEditModel) form.getInput();
        model.addPropertyChangeListener(propertyName, this);
    }

    @Override
    public void dispose() {
        super.dispose();
        if (model != null)
            model.removePropertyChangeListener(propertyName, this);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        IFormPage page = (IFormPage) getManagedForm().getContainer();
        if (page.isActive()) {
            refresh();
        } else {
            markStale();
        }
    }

    @Override
    public void refresh() {
        Map<String,String> tmp = loadProperties(model);
        if (tmp == null) {
            this.properties = new HashMap<String,String>();
        } else {
            this.properties = new HashMap<String,String>(tmp);
        }
        viewer.setInput(properties);
        super.refresh();
    }

    @Override
    public void commit(boolean onSave) {
        super.commit(onSave);
        saveProperties(model, properties);
    }

    protected abstract Map<String,String> loadProperties(BndEditModel model);

    protected abstract void saveProperties(BndEditModel model, Map<String,String> props);
}
TOP

Related Classes of bndtools.editor.common.PropertyTableSectionPart

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.