Package com.dubture.composer.ui.editor.composer

Source Code of com.dubture.composer.ui.editor.composer.RepositoriesSection$RepositoriesController

package com.dubture.composer.ui.editor.composer;

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

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

import com.dubture.composer.ui.ComposerUIPluginImages;
import com.dubture.composer.ui.controller.IController;
import com.dubture.composer.ui.dialogs.RepositoryDialog;
import com.dubture.composer.ui.editor.ComposerFormPage;
import com.dubture.composer.ui.editor.FormLayoutFactory;
import com.dubture.composer.ui.editor.TableSection;
import com.dubture.composer.ui.parts.TablePart;
import com.dubture.getcomposer.core.collection.Repositories;
import com.dubture.getcomposer.core.repositories.ComposerRepository;
import com.dubture.getcomposer.core.repositories.GitRepository;
import com.dubture.getcomposer.core.repositories.MercurialRepository;
import com.dubture.getcomposer.core.repositories.PackageRepository;
import com.dubture.getcomposer.core.repositories.PearRepository;
import com.dubture.getcomposer.core.repositories.Repository;
import com.dubture.getcomposer.core.repositories.SubversionRepository;

public class RepositoriesSection extends TableSection implements PropertyChangeListener {

  private TableViewer repositoryViewer;
 
  private IAction addAction;
  private IAction editAction;
  private IAction removeAction;
 
  private static final int ADD_INDEX = 0;
  private static final int EDIT_INDEX = 1;
  private static final int REMOVE_INDEX = 2;

  class RepositoriesController extends LabelProvider implements IController {

    private Repositories repositories;
    private Map<String, Image> images = new HashMap<String, Image>();
    private Map<String, ImageDescriptor> descriptors = new HashMap<String, ImageDescriptor> () {
      private static final long serialVersionUID = -2019489473873127982L;

      {
        put("generic", ComposerUIPluginImages.REPO_GENERIC);
        put("git", ComposerUIPluginImages.REPO_GIT);
        put("svn", ComposerUIPluginImages.REPO_SVN);
        put("mercurial", ComposerUIPluginImages.REPO_MERCURIAL);
        put("pear", ComposerUIPluginImages.REPO_PEAR);
        put("composer", ComposerUIPluginImages.REPO_COMPOSER);
        put("package", ComposerUIPluginImages.REPO_PACKAGE);
      }
    };

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
      repositories = (Repositories)newInput;
    }

    public Object[] getElements(Object inputElement) {
      return repositories.toArray();
    }
   
    @Override
    public String getText(Object element) {
      if (element instanceof Repository) {
        Repository repo = (Repository)element;
        String name;
       
        // name
        if (repo.has("name")) {
          name = repo.getAsString("name");
        } else {
          name = repo.getUrl();
        }
       
        return name;
      }

      return super.getText(element);
    }
   
    private Image createImage(String type) {
      if (descriptors.containsKey(type)) {
        return descriptors.get(type).createImage();
      }
     
      return null;
    }
   
    private Image getRepoImage(String type) {
      if (!images.containsKey(type)) {
        images.put(type, createImage(type));
      }
      return images.get(type);
    }
   
    @Override
    public Image getImage(Object element) {
      if (element instanceof GitRepository) {
        return getRepoImage("git");
      } else if (element instanceof SubversionRepository) {
        return getRepoImage("svn");
      } else if (element instanceof MercurialRepository) {
        return getRepoImage("mercurial");
      } else if (element instanceof PearRepository) {
        return getRepoImage("pear");
      } else if (element instanceof PackageRepository) {
        return getRepoImage("package");
      } else if (element instanceof ComposerRepository) {
        return getRepoImage("composer");
      } else if (element instanceof Repository) {
        return getRepoImage("generic");
      }
     
      return null;
    }
  }
 
  public RepositoriesSection(ComposerFormPage page, Composite parent) {
    super(page, parent, Section.DESCRIPTION, new String[]{"Add...", "Edit...", "Remove"});
    createClient(getSection(), page.getManagedForm().getToolkit());
  }
 

  @Override
  protected void createClient(Section section, FormToolkit toolkit) {
    section.setText("Repositories");
    section.setDescription("Manage repositories as sources for this package.");
    section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    Composite container = createClientContainer(section, 2, toolkit);
    createViewerPartControl(container, SWT.MULTI, 2, toolkit);
    TablePart tablePart = getTablePart();
    RepositoriesController repositoriesController = new RepositoriesController();
    repositoryViewer = tablePart.getTableViewer();
    repositoryViewer.setContentProvider(repositoriesController);
    repositoryViewer.setLabelProvider(repositoriesController);
   
    toolkit.paintBordersFor(container);
    section.setClient(container);
    section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));

    repositoryViewer.setInput(composerPackage.getRepositories());
    composerPackage.addPropertyChangeListener(this);
    updateButtons();
   
    makeActions();
    updateMenu();
  }
 
  protected boolean createCount() {
    return true;
  }
 
  private void updateButtons() {
    ISelection selection = repositoryViewer.getSelection();
   
    TablePart tablePart = getTablePart();
    tablePart.setButtonEnabled(ADD_INDEX, enabled);
    tablePart.setButtonEnabled(EDIT_INDEX, !selection.isEmpty() && enabled);
    tablePart.setButtonEnabled(REMOVE_INDEX, !selection.isEmpty() && enabled);
  }
 
  private void updateMenu() {
    IStructuredSelection selection = (IStructuredSelection)repositoryViewer.getSelection();
   
    editAction.setEnabled(selection.size() > 0);
    removeAction.setEnabled(selection.size() > 0);
  }
 
  @Override
  public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);
    updateButtons();
   
    refresh();
    repositoryViewer.getTable().setEnabled(enabled);
  }

  public void refresh() {
    repositoryViewer.refresh();
    super.refresh();
  }

  @Override
  public void propertyChange(PropertyChangeEvent e) {
    if (e.getPropertyName().startsWith("repositories")) {
      refresh();
    }
  }
 
  protected void selectionChanged(IStructuredSelection sel) {
    updateButtons();
    updateMenu();
  }
 
  private void makeActions() {
    addAction = new Action("Add...") {
      public void run() {
        handleAdd();
      }
    };
   
    editAction = new Action("Edit...") {
      public void run() {
        handleEdit();
      }
    };
   
    removeAction = new Action("Remove") {
      public void run() {
        handleRemove();
      }
    };
  }
 
  @Override
  protected void fillContextMenu(IMenuManager manager) {
    manager.add(addAction);
    manager.add(editAction);
    manager.add(removeAction);
  }
 
  private void handleAdd() {
    RepositoryDialog diag = new RepositoryDialog(repositoryViewer.getTable().getShell());
    if (diag.open() == Dialog.OK) {
      composerPackage.getRepositories().add(diag.getRepository());
    }
  }
 
  private void handleEdit() {
    Repository repo = (Repository)((StructuredSelection)repositoryViewer.getSelection()).getFirstElement();
    RepositoryDialog diag = new RepositoryDialog(repositoryViewer.getTable().getShell(), repo.clone());
    if (diag.open() == Dialog.OK) {
      Repository newRepo = diag.getRepository();
      repo.setName(newRepo.getName());
      repo.setUrl(newRepo.getUrl());
    }
  }
 
  @SuppressWarnings("unchecked")
  private void handleRemove() {
    StructuredSelection selection = ((StructuredSelection)repositoryViewer.getSelection());
    Iterator<Object> it = selection.iterator();
    String[] names = new String[selection.size()];
    List<Repository> repos = new ArrayList<Repository>();

    for (int i = 0; it.hasNext(); i++) {
      Repository repo = (Repository)it.next();
      repos.add(repo);
      names[i] = repo.getName();
    }
   
    MessageDialog diag = new MessageDialog(
        repositoryViewer.getTable().getShell(),
        "Remove Repositor" + (selection.size() > 1 ? "ies" : "y"),
        null,
        "Do you really wan't to remove " + StringUtils.join(names, ", ") + "?",
        MessageDialog.WARNING,
        new String[] {"Yes", "No"},
        0);
   
    if (diag.open() == Dialog.OK) {
      for (Repository repo : repos) {
        composerPackage.getRepositories().remove(repo);
      }
    }
  }
 
  @Override
  protected void buttonSelected(int index) {
    switch (index) {
    case ADD_INDEX:
      handleAdd();
      break;
     
    case EDIT_INDEX:
      handleEdit();
      break;
     
    case REMOVE_INDEX:
      handleRemove();
      break;
    }
  }
}
TOP

Related Classes of com.dubture.composer.ui.editor.composer.RepositoriesSection$RepositoriesController

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.