Package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository

Source Code of org.apache.felix.sigil.eclipse.ui.internal.preferences.repository.RepositoriesView

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.felix.sigil.eclipse.ui.internal.preferences.repository;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.felix.sigil.eclipse.SigilCore;
import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
import org.apache.felix.sigil.eclipse.ui.actions.RefreshRepositoryAction;
import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
import org.apache.felix.sigil.eclipse.ui.wizard.repository.RepositoryWizard;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.Table;

public class RepositoriesView
{
    private final RepositoriesPreferencePage page;

    private List<IRepositoryModel> repositories;

    private TableViewer repositoryView;

    public RepositoriesView(RepositoriesPreferencePage page)
    {
        this.page = page;
    }

    public Control createContents(Composite parent)
    {
        // Create Controls
        Composite composite = new Composite(parent, SWT.NONE);

        Table table = new Table(composite, SWT.MULTI | SWT.BORDER);

        // Table Viewer Setup
        repositoryView = new TableViewer(table);
        repositoryView.setLabelProvider(new LabelProvider()
        {
            @Override
            public String getText(Object element)
            {
                IRepositoryModel rep = (IRepositoryModel) element;
                return rep.getName();
            }

            @Override
            public Image getImage(Object element)
            {
                IRepositoryModel rep = (IRepositoryModel) element;
                return rep.getType().getIcon();
            }
        });

        repositoryView.setContentProvider(new DefaultTableProvider()
        {
            public Object[] getElements(Object inputElement)
            {
                return toArray(inputElement);
            }
        });

        // Layout
        composite.setLayout(new GridLayout(2, false));
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 7));

        createButtons(composite, repositoryView);

        repositories = SigilCore.getRepositoryPreferences().loadRepositories();
        repositoryView.setInput(repositories);

        return composite;
    }

    private void createButtons(final Composite composite, final TableViewer repositoryView)
    {
        final Button add = new Button(composite, SWT.PUSH);
        add.setText("Add...");
        add.setEnabled(true);

        final Button upBtn = new Button(composite, SWT.PUSH);
        upBtn.setText("Up");
        upBtn.setEnabled(false);

        final Button downBtn = new Button(composite, SWT.PUSH);
        downBtn.setText("Down");
        downBtn.setEnabled(false);
       
        final Button edit = new Button(composite, SWT.PUSH);
        edit.setText("Edit...");
        edit.setEnabled(false);
       
        final Button remove = new Button(composite, SWT.PUSH);
        remove.setText("Remove");
        remove.setEnabled(false);

        final Button refresh = new Button(composite, SWT.PUSH);
        refresh.setText("Refresh");
        refresh.setEnabled(false);
               
        // Listeners
        add.addSelectionListener(new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent e)
            {
                add(composite);
            }
        });

        edit.addSelectionListener(new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent e)
            {
                IStructuredSelection sel = (IStructuredSelection) repositoryView.getSelection();
                edit(composite, sel);
            }
        });

        remove.addSelectionListener(new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent e)
            {
                IStructuredSelection sel = (IStructuredSelection) repositoryView.getSelection();
                remove(sel);
            }
        });

        refresh.addSelectionListener(new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent e)
            {
                IStructuredSelection sel = (IStructuredSelection) repositoryView.getSelection();
                refresh(composite, sel);
            }
        });

        upBtn.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                up();
            }
        });
       
        downBtn.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                down();
            }
        });
       
        repositoryView.addSelectionChangedListener(new ISelectionChangedListener()
        {
            public void selectionChanged(SelectionChangedEvent event)
            {
                boolean selected = !event.getSelection().isEmpty();
                if (selected)
                {
                    refresh.setEnabled(true);

                    IStructuredSelection sel = (IStructuredSelection) event.getSelection();

                    checkEditEnabled(edit, sel);
                    checkRemoveEnabled(remove, sel);
                    upBtn.setEnabled(sel.size() == 1);
                    downBtn.setEnabled(sel.size() == 1);
                }
                else
                {
                    upBtn.setEnabled(false);
                    downBtn.setEnabled(false);
                    refresh.setEnabled(false);
                    edit.setEnabled(false);
                    remove.setEnabled(false);
                }
            }
        });

        // layout
        add.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        upBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        downBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        edit.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        remove.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
    }
   
    private void up()
    {
        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) repositoryView.getSelection()).getFirstElement();
        int i = repositories.indexOf(model);
        if (i > 0)
        {
            repositories.remove(i);
            repositories.add(i - 1, model);
            repositoryView.refresh();
        }
    }

    private void down()
    {
        IRepositoryModel model = (IRepositoryModel) ((StructuredSelection) repositoryView.getSelection()).getFirstElement();
        int i = repositories.indexOf(model);
        if (i < repositories.size() - 1)
        {
            repositories.remove(i);
            repositories.add(i + 1, model);
            repositoryView.refresh();
        }
    }   

    @SuppressWarnings("unchecked")
    private void checkRemoveEnabled(Button button, IStructuredSelection sel)
    {
        boolean alldynamic = true;
        for (Iterator i = sel.iterator(); i.hasNext();)
        {
            IRepositoryModel model = (IRepositoryModel) i.next();
            if (!model.getType().isDynamic())
            {
                alldynamic = false;
                break;
            }
        }
        button.setEnabled(alldynamic);
    }

    private void checkEditEnabled(Button edit, IStructuredSelection sel)
    {
        if (sel.size() == 1)
        {
            IRepositoryModel element = (IRepositoryModel) sel.getFirstElement();
            if (WizardHelper.hasWizard(element.getType()))
            {
                edit.setEnabled(true);
            }
            else
            {
                edit.setEnabled(false);
            }
        }
        else
        {
            edit.setEnabled(false);
        }
    }

    @SuppressWarnings("unchecked")
    private void refresh(Control parent, IStructuredSelection sel)
    {
        ArrayList<IRepositoryModel> models = new ArrayList<IRepositoryModel>(sel.size());

        for (Iterator i = sel.iterator(); i.hasNext();)
        {
            IRepositoryModel model = (IRepositoryModel) i.next();
            models.add(model);
        }

        new RefreshRepositoryAction(models.toArray(new IRepositoryModel[models.size()])).run();
    }

    private void add(Control parent)
    {
        NewRepositoryWizard wizard = new NewRepositoryWizard();
        WizardDialog dialog = new WizardDialog(getShell(parent), wizard);
        if (dialog.open() == Window.OK)
        {
            repositories.add(wizard.getRepository());
            updated();
        }
    }

    private void edit(Control parent, IStructuredSelection sel)
    {
        IRepositoryModel model = (IRepositoryModel) sel.getFirstElement();
        try
        {
            RepositoryWizard wizard = WizardHelper.loadWizard(model.getType());
            wizard.init(model);
            WizardDialog dialog = new WizardDialog(getShell(parent), wizard);
            if (dialog.open() == Window.OK)
            {
                updated();
            }
        }
        catch (CoreException e)
        {
            SigilCore.error("Failed to load wizard", e);
            MessageDialog.openError(getShell(parent), "Error", "Failed to load wizard:"
                + e.getStatus().getMessage());
        }
    }

    private Shell getShell(Control parent)
    {
        return parent.getShell();
    }

    @SuppressWarnings("unchecked")
    private void remove(IStructuredSelection sel)
    {
        boolean change = false;
        for (Iterator i = sel.iterator(); i.hasNext();)
        {
            change = repositories.remove(i.next());
        }

        if (change)
        {
            updated();
        }
    }

    private void updated()
    {
        repositoryView.refresh();
        page.changed();
    }

    public List<IRepositoryModel> getRepositories()
    {
        return repositories;
    }
}
TOP

Related Classes of org.apache.felix.sigil.eclipse.ui.internal.preferences.repository.RepositoriesView

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.