Package org.springframework.ide.eclipse.beans.ui.properties

Source Code of org.springframework.ide.eclipse.beans.ui.properties.ConfigSetsTab

/*******************************************************************************
* Copyright (c) 2004, 2013 Spring IDE Developers
* 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:
*     Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.beans.ui.properties;

import java.util.Set;

import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Label;
import org.eclipse.swt.widgets.Tree;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfigSet;
import org.springframework.ide.eclipse.beans.ui.BeansUIPlugin;
import org.springframework.ide.eclipse.beans.ui.properties.model.PropertiesConfig;
import org.springframework.ide.eclipse.beans.ui.properties.model.PropertiesConfigSet;
import org.springframework.ide.eclipse.beans.ui.properties.model.PropertiesModel;
import org.springframework.ide.eclipse.beans.ui.properties.model.PropertiesModelLabelProvider;
import org.springframework.ide.eclipse.beans.ui.properties.model.PropertiesProject;
import org.springframework.ide.eclipse.core.model.IModelChangeListener;
import org.springframework.ide.eclipse.core.model.IModelElement;
import org.springframework.ide.eclipse.core.model.ModelChangeEvent;
import org.springsource.ide.eclipse.commons.ui.SpringUIUtils;

/**
* Property page tab for defining the beans config sets.
* @author Torsten Juergeleit
* @author Christian Dupuis
*/
public class ConfigSetsTab {

  private static class ConfigSetContentProvider implements ITreeContentProvider {

    private PropertiesProject project;

    public ConfigSetContentProvider(PropertiesProject project) {
      this.project = project;
    }

    public void dispose() {
    }

    public Object[] getChildren(Object parentElement) {
      if (parentElement instanceof PropertiesProject) {
        Set<IBeansConfigSet> configSets = ((PropertiesProject) parentElement)
            .getConfigSets();
        return configSets.toArray();
      }
      else if (parentElement instanceof PropertiesConfigSet) {
        Set<IBeansConfig> configs = ((PropertiesConfigSet) parentElement).getConfigs();
        return configs.toArray();
      }
      return IModelElement.NO_CHILDREN;
    }

    public Object[] getElements(Object obj) {
      return getChildren(project);
    }

    public Object getParent(Object element) {
      if (element instanceof PropertiesConfigSet) {
        return ((PropertiesConfigSet) element).getElementParent();
      }
      else if (element instanceof PropertiesConfig) {
        return ((PropertiesConfig) element).getElementParent().getElementParent();
      }
      return null;
    }

    public boolean hasChildren(Object element) {
      return (getChildren(element).length > 0);
    }

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    }
  }

  private static class ConfigSetsSorter extends ViewerSorter {
    @Override
    public void sort(Viewer viewer, Object[] elements) {

      // Do NOT sort configs within a config set
      if (elements.length > 0 && !(elements[0] instanceof IBeansConfig)) {
        super.sort(viewer, elements);
      }
    }
  }

  private static final String PREFIX = "ConfigurationPropertyPage." + "tabConfigSets.";

  private static final String DESCRIPTION = PREFIX + "description";

  private static final String NEW_BUTTON = PREFIX + "newButton";

  private static final String EDIT_BUTTON = PREFIX + "editButton";

  private static final String REMOVE_BUTTON = PREFIX + "removeButton";

  private static final String UP_BUTTON = PREFIX + "upButton";

  private static final String DOWN_BUTTON = PREFIX + "downButton";

  private static final int TABLE_WIDTH = 250;

  private PropertiesModel model;

  private PropertiesProject project;

  private Tree configSetsTree;

  private TreeViewer configSetsViewer;

  private IModelElement selectedElement;

  private Button newButton, editButton, removeButton, upButton, downButton;

  private SelectionListener buttonListener = new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
      handleButtonPressed((Button) e.widget);
    }
  };

  private IModelChangeListener modelChangeListener = new IModelChangeListener() {
    public void elementChanged(ModelChangeEvent event) {
      if (configSetsViewer != null && !configSetsViewer.getControl().isDisposed()) {
        configSetsViewer.refresh();
      }
    }
  };

  private boolean hasUserMadeChanges;

  public ConfigSetsTab(PropertiesModel model, PropertiesProject project,
      IModelElement selectedModelElement) {
    this.model = model;
    this.project = project;
    calculateSelectedElement(selectedModelElement);
  }

  private void calculateSelectedElement(IModelElement modelElement) {
    if (modelElement != null && this.project != null) {
      this.selectedElement = this.project.getConfigSet(modelElement.getElementName());
    }
  }

  public Control createControl(Composite parent) {
    Composite composite = new Composite(parent, SWT.NONE);
    GridLayout layout = new GridLayout();
    layout.marginHeight = 3;
    layout.marginWidth = 3;
    composite.setLayout(layout);
    composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    Label description = new Label(composite, SWT.WRAP);
    description.setText(BeansUIPlugin.getResourceString(DESCRIPTION));
    description.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    Composite tableAndButtons = new Composite(composite, SWT.NONE);
    tableAndButtons.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    layout = new GridLayout();
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    layout.numColumns = 2;
    tableAndButtons.setLayout(layout);

    // Create table and viewer for Spring bean configurations
    configSetsTree = new Tree(tableAndButtons, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    GridData data = new GridData(GridData.FILL_HORIZONTAL);
    data.widthHint = TABLE_WIDTH;
    data.heightHint = TABLE_WIDTH;
    configSetsTree.setLayoutData(data);
    configSetsTree.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        handleTreeSelectionChanged();
      }
    });
    configSetsViewer = new TreeViewer(configSetsTree);
    configSetsViewer.setContentProvider(new ConfigSetContentProvider(project));
    configSetsViewer.setLabelProvider(new PropertiesModelLabelProvider());
    configSetsViewer.setSorter(new ConfigSetsSorter());
    configSetsViewer.setInput(project.getProject()); // activate content
    // provider
    configSetsViewer.expandToLevel(project, 1);
    configSetsViewer.addDoubleClickListener(new IDoubleClickListener() {
      public void doubleClick(DoubleClickEvent event) {
        handleDoubleClick(event);
      }
    });

    if (this.selectedElement != null) {
      configSetsViewer.setSelection(new StructuredSelection(this.selectedElement), true);
    }

    // Create button area
    Composite buttonArea = new Composite(tableAndButtons, SWT.NONE);
    layout = new GridLayout();
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    buttonArea.setLayout(layout);
    buttonArea.setLayoutData(new GridData(GridData.FILL_VERTICAL));
    newButton = SpringUIUtils.createButton(buttonArea, BeansUIPlugin
        .getResourceString(NEW_BUTTON), buttonListener);
    editButton = SpringUIUtils.createButton(buttonArea, BeansUIPlugin
        .getResourceString(EDIT_BUTTON), buttonListener, 0, false);
    removeButton = SpringUIUtils.createButton(buttonArea, BeansUIPlugin
        .getResourceString(REMOVE_BUTTON), buttonListener, 0, false);
    upButton = SpringUIUtils.createButton(buttonArea, BeansUIPlugin
        .getResourceString(UP_BUTTON), buttonListener, 0, false);
    downButton = SpringUIUtils.createButton(buttonArea, BeansUIPlugin
        .getResourceString(DOWN_BUTTON), buttonListener, 0, false);
    model.addChangeListener(modelChangeListener);

    handleTreeSelectionChanged();

    return composite;
  }

  public void dispose() {
    model.removeChangeListener(modelChangeListener);
  }

  /**
   * One of the buttons has been pressed, act accordingly.
   */
  private void handleButtonPressed(Button button) {
    if (button == newButton) {
      handleNewButtonPressed();
    }
    else if (button == editButton) {
      handleEditButtonPressed();
    }
    else if (button == removeButton) {
      handleRemoveButtonPressed();
    }
    else if (button == upButton) {
      handleUpButtonPressed();
    }
    else if (button == downButton) {
      handleDownButtonPressed();
    }
    handleTreeSelectionChanged();
    configSetsTree.setFocus();
  }

  private void handleDoubleClick(DoubleClickEvent event) {
    ISelection selection = event.getSelection();
    if (selection instanceof IStructuredSelection) {
      Object elem = ((IStructuredSelection) selection).getFirstElement();
      if (elem instanceof PropertiesProject) {

        // Expand or collapse selected project
        if (configSetsViewer.getExpandedState(elem)) {
          configSetsViewer.collapseToLevel(elem, AbstractTreeViewer.ALL_LEVELS);
        }
        else {
          configSetsViewer.expandToLevel(elem, 1);
        }
      }
      else if (elem instanceof PropertiesConfigSet) {

        // Edit corresponding config set
        handleEditButtonPressed();
      }
    }
  }

  /**
   * The user has pressed the down button. Move the selected config down.
   */
  private void handleDownButtonPressed() {
    if (selectedElement != null && selectedElement instanceof PropertiesConfig) {
      PropertiesConfig config = (PropertiesConfig) selectedElement;
      PropertiesConfigSet configSet = (PropertiesConfigSet) config.getElementParent();
      configSet.moveConfigDown(config);
      configSetsViewer.refresh(false);
      hasUserMadeChanges = true;
    }
  }

  /**
   * The user has pressed the add button. Opens the configuration selection dialog and adds the
   * selected configuration.
   */
  private void handleEditButtonPressed() {
    if (selectedElement != null && selectedElement instanceof PropertiesConfigSet) {
      ConfigSetDialog dialog = new ConfigSetDialog(SpringUIUtils.getStandardDisplay()
          .getActiveShell(), project, selectedElement.getElementName(),
          ((PropertiesConfigSet) selectedElement).getType());
      if (dialog.open() == Window.OK) {
        configSetsViewer.refresh(false);
        hasUserMadeChanges = true;
      }
    }
  }

  /**
   * The user has pressed the new button. Opens the config set definition dialog and adds the
   * specified config set.
   */
  private void handleNewButtonPressed() {
    ConfigSetDialog dialog = new ConfigSetDialog(SpringUIUtils.getStandardDisplay()
        .getActiveShell(), project, null, IBeansConfigSet.Type.MANUAL);
    if (dialog.open() == Window.OK) {
      configSetsViewer.refresh(false);
      hasUserMadeChanges = true;
    }
  }

  /**
   * The user has pressed the remove button. Delete the selected config set.
   */
  private void handleRemoveButtonPressed() {
    if (selectedElement != null && selectedElement instanceof PropertiesConfigSet) {
      project.removeConfigSet(selectedElement.getElementName());
      configSetsViewer.refresh(false);
      hasUserMadeChanges = true;
    }
  }

  /**
   * The user has selected a different configuration in table. Update button enablement.
   */
  private void handleTreeSelectionChanged() {
    boolean moveButtonsEnabled = false;
    boolean editButtonsEnabled = false;
    IStructuredSelection selection = (IStructuredSelection) configSetsViewer.getSelection();
    Object selected = selection.getFirstElement();
    if (selected != null) {
      if (selected instanceof PropertiesConfigSet) {
        selectedElement = (PropertiesConfigSet) selected;
        editButtonsEnabled = ((PropertiesConfigSet) selectedElement).getType()
          == IBeansConfigSet.Type.MANUAL;
      }
      else if (selected instanceof PropertiesConfig) {
        PropertiesConfig config = (PropertiesConfig) selected;
        PropertiesConfigSet configSet = (PropertiesConfigSet) config.getElementParent();
        if (configSet != null && configSet.getConfigs().size() > 1) {
          selectedElement = config;
          moveButtonsEnabled = true;
        }
      }
      else {
        selectedElement = null;
      }
    }
    else {
      selectedElement = null;
    }
    editButton.setEnabled(editButtonsEnabled);
    removeButton.setEnabled(editButtonsEnabled);
    upButton.setEnabled(moveButtonsEnabled);
    downButton.setEnabled(moveButtonsEnabled);
  }

  /**
   * The user has pressed the up button. Move the selected config up.
   */
  private void handleUpButtonPressed() {
    if (selectedElement != null && selectedElement instanceof PropertiesConfig) {
      PropertiesConfig config = (PropertiesConfig) selectedElement;
      PropertiesConfigSet configSet = (PropertiesConfigSet) config.getElementParent();
      configSet.moveConfigUp(config);
      configSetsViewer.refresh(false);
      hasUserMadeChanges = true;
    }
  }

  public boolean hasUserMadeChanges() {
    return hasUserMadeChanges;
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.beans.ui.properties.ConfigSetsTab

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.