Skip to content
Snippets Groups Projects
Commit f1f59f52 authored by Chen Wenwen's avatar Chen Wenwen
Browse files

YELLOW

refs 1005
parent 64f49786
No related branches found
No related tags found
No related merge requests found
/*--------------------------------------------------------------------------+
$Id: ElementTreeMultiSelectDialog.java 5186 2012-07-27 20:23:37Z ratiu $
| |
| Copyright 2011 ForTISS GmbH |
| |
| Licensed 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.fortiss.tooling.base.ui.dialog;
import static org.eclipse.jface.dialogs.IDialogConstants.CANCEL_ID;
import static org.eclipse.jface.dialogs.IDialogConstants.CANCEL_LABEL;
import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
import static org.eclipse.jface.dialogs.IDialogConstants.OK_LABEL;
import static org.eclipse.wb.swt.ResourceManager.decorateImage;
import static org.eclipse.wb.swt.ResourceManager.getPluginImage;
import static org.eclipse.wb.swt.SWTResourceManager.BOTTOM_RIGHT;
import java.util.ArrayList;
import java.util.List;
import org.conqat.ide.commons.ui.jface.TreeContentProviderBase;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
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.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* This dialog offers a common dialog to show multi-root tree structures and
* allows user to select multiple items in the tree. It also offers an interface
* to edit the tree on the fly.
*
* @author mou
* @author $Author: ratiu $
* @version $Rev: 5186 $
* @ConQAT.Rating GREEN Hash: 31BF09CC6D793B7423E341348D58FF4B
*/
public class ElementTreeMultiSelectEditableDialog extends TitleAreaDialog {
/** Default content provider */
private static class EmptyTreeContentProvider extends TreeContentProviderBase {
/** {@inheritDoc} */
@Override
public Object[] getChildren(Object parentElement) {
return new Object[0];
}
}
/** Label provider which adds selected icon on the original icon */
private class DecorateLabelProvider extends LabelProvider {
/** {@inheritDoc} */
@Override
public String getText(Object element) {
return labelSupport.getText(element);
}
/** {@inheritDoc} */
@Override
public Image getImage(Object element) {
Image image = labelSupport.getImage(element);
if(!selectedElements.contains(element))
return image;
Image icon = getPluginImage("org.eclipse.ui", "/icons/full/ovr16/pinned_ovr.gif");
if(icon == null)
return image;
return decorateImage(image, icon, BOTTOM_RIGHT);
}
}
/** roots of the tree */
private ArrayList<Object> rootElements;
/** selected element */
private ArrayList<Object> selectedElements;
/** the editing module */
private IDialogEditSupport dialogEditSupport;
/** content provider for the roots */
private ITreeContentProvider contentSupport;
/** label provider for the elements */
private ILabelProvider labelSupport;
/** the selected element in SelectTreeViewer */
private TreePath selectedPath;
/** The gui composite */
private ElementTreeMultiSelectEditableDialogGUI gui;
/** Constructor */
public ElementTreeMultiSelectEditableDialog(Shell parentShell, List<?> roots, List<?> selected,
ITreeContentProvider contentProvider, ILabelProvider labelProvider,
IDialogEditSupport edit) {
super(parentShell);
dialogEditSupport = edit;
contentSupport = contentProvider;
labelSupport = labelProvider;
if(roots == null)
rootElements = new ArrayList<Object>();
else
rootElements = new ArrayList<Object>(roots);
if(selected == null) {
selectedElements = new ArrayList<Object>();
} else {
selectedElements = new ArrayList<Object>(selected);
}
}
/** {@inheritDoc} */
@Override
protected Control createDialogArea(Composite parent) {
setHelpAvailable(false);
setTitle("Select");
setMessage("Select one or more elements");
// create controls
Composite area = (Composite)super.createDialogArea(parent);
gui = new ElementTreeMultiSelectEditableDialogGUI(area, SWT.NONE);
// hide edit toolbar if no edit function is available
if(dialogEditSupport == null) {
gui.getLeftToolBar().setVisible(false);
((GridData)gui.getLeftToolBar().getLayoutData()).exclude = true;
}
// create listeners
gui.getCreateButton().addSelectionListener(new SelectionAdapter() {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
createElement();
}
});
gui.getDeleteButton().addSelectionListener(new SelectionAdapter() {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
deleteElement();
}
});
gui.getEditButton().addSelectionListener(new SelectionAdapter() {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
editElement();
}
});
gui.getSelectButton().addSelectionListener(new SelectionAdapter() {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
selectElement();
}
});
gui.getDeselectButton().addSelectionListener(new SelectionAdapter() {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
deselectElement();
}
});
gui.getElementTreeViewer().addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
selectElement();
}
});
gui.getElementTreeViewer().addPostSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelectionElementTree();
}
});
gui.getSelectTreeViewer().addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
deselectElement();
}
});
gui.getSelectTreeViewer().addPostSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelectionSelectTree();
}
});
// label, content and input
gui.getElementTreeViewer().setLabelProvider(new DecorateLabelProvider());
gui.getSelectTreeViewer().setLabelProvider(new DecorateLabelProvider());
gui.getElementTreeViewer().setContentProvider(
new MultiRootTreeContentProvider(rootElements, contentSupport));
gui.getSelectTreeViewer().setContentProvider(
new MultiRootTreeContentProvider(selectedElements, new EmptyTreeContentProvider()));
gui.getElementTreeViewer().setInput(rootElements);
gui.getSelectTreeViewer().setInput(selectedElements);
setDefaultSelection();
return area;
}
/** set the default selection for element tree */
private void setDefaultSelection() {
List<Object> path = new ArrayList<Object>();
if(rootElements.size() <= 0) {
return;
}
Object child = rootElements.get(0);
path.add(child);
while(contentSupport.getChildren(child).length > 0) {
child = contentSupport.getChildren(child)[0];
path.add(child);
if(child == null)
return;
}
path.add(child);
gui.getElementTreeViewer().setSelection(new TreeSelection(new TreePath(path.toArray())),
true);
}
/** check the selection of element tree viewer */
private void checkSelectionElementTree() {
// find the path to the element
ITreeSelection selection = (ITreeSelection)gui.getElementTreeViewer().getSelection();
if(selection.getPaths() == null || selection.getPaths().length != 1 ||
!acceptElement(selection.getPaths()[0].getLastSegment())) {
gui.getSelectButton().setEnabled(false);
} else {
gui.getSelectButton().setEnabled(true);
}
gui.getDeselectButton().setEnabled(false);
gui.getCreateButton().setEnabled(true);
gui.getDeleteButton().setEnabled(true);
gui.getEditButton().setEnabled(true);
}
/** check the selection of element tree viewer */
private void checkSelectionSelectTree() {
// find the path to the element
ITreeSelection selection = (ITreeSelection)gui.getSelectTreeViewer().getSelection();
if(selection.getPaths() == null || selection.getPaths().length != 1 ||
!acceptElement(selection.getPaths()[0].getLastSegment())) {
gui.getDeselectButton().setEnabled(false);
} else {
gui.getDeselectButton().setEnabled(true);
selectedPath = selection.getPaths()[0];
}
gui.getSelectButton().setEnabled(false);
gui.getCreateButton().setEnabled(false);
gui.getDeleteButton().setEnabled(false);
gui.getEditButton().setEnabled(false);
}
/** {@inheritDoc} */
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, OK_ID, OK_LABEL, false);
createButton(parent, CANCEL_ID, CANCEL_LABEL, true);
}
/** {@inheritDoc} */
@Override
protected Point getInitialSize() {
return new Point(640, 480);
}
/** Returns configuration. */
public IDialogEditSupport getEditSupport() {
return dialogEditSupport;
}
/** Returns rootElements. */
public List<Object> getRootElements() {
return rootElements;
}
/** Returns selectedElements. */
public List<Object> getMultiSelectedElements() {
return selectedElements;
}
/** Returns selectedElement. */
public Object getSingleSelectedElement() {
if(selectedPath == null)
return null;
return selectedPath.getLastSegment();
}
/** Returns contentSupport. */
public IStructuredContentProvider getContentProvider() {
return contentSupport;
}
/** Returns labelSupport. */
public ILabelProvider getLabelProvider() {
return labelSupport;
}
/** Add selected elements to the select list. */
private void selectElement() {
try {
// find the path to the element
ITreeSelection selection = (ITreeSelection)gui.getElementTreeViewer().getSelection();
if(selection.getPaths() == null)
return;
for(TreePath path : selection.getPaths()) {
if(!canSelect(path.getLastSegment())) {
continue;
}
Object convertedSelection = selectConverterAction(path.getLastSegment());
if(convertedSelection == null || selectedElements.contains(convertedSelection))
continue;
if(acceptElement(path.getLastSegment())) {
selectedElements.add(convertedSelection);
gui.getSelectTreeViewer().add(selectedElements, convertedSelection);
gui.getElementTreeViewer().update(convertedSelection, null);
}
}
} catch(Exception e2) {
e2.printStackTrace();
}
}
/** Remove selected elements from the select list */
private void deselectElement() {
try {
// find the path to the element
ITreeSelection selection = (ITreeSelection)gui.getSelectTreeViewer().getSelection();
if(selection.getPaths() == null)
return;
for(TreePath path : selection.getPaths()) {
if(!canDeselect(path.getLastSegment())) {
continue;
}
deselectAction(path.getLastSegment());
if(selectedElements.remove(path.getLastSegment())) {
gui.getSelectTreeViewer().remove(path.getLastSegment());
gui.getElementTreeViewer().update(path.getLastSegment(), null);
}
}
} catch(Exception e2) {
e2.printStackTrace();
}
}
/** Create an element */
private void createElement() {
if(dialogEditSupport == null)
return;
try {
// find the path to hold the new element
ITreeSelection selection = (ITreeSelection)gui.getElementTreeViewer().getSelection();
if(selection.getPaths() == null || selection.getPaths().length != 1)
return; // at most 1 element can be selected
// create the new element
Object o;
if(selection.getPaths() == null) {
o = dialogEditSupport.createElement(null);
} else {
o = dialogEditSupport.createElement(selection.getPaths()[0].getLastSegment());
}
if(o == null)
return;
TreePath path;
if(selection.getPaths() == null) {
path = new TreePath(new Object[] {rootElements});
rootElements.add(o);
} else {
path = selection.getPaths()[0];
}
// insert the new element
gui.getElementTreeViewer().add(path, o);
gui.getElementTreeViewer().reveal(o);
gui.getElementTreeViewer().refresh();
} catch(Exception e2) {
e2.printStackTrace();
}
}
/** Call delete function on the selected elements */
private void deleteElement() {
if(dialogEditSupport == null)
return;
try {
ITreeSelection selection = (ITreeSelection)gui.getElementTreeViewer().getSelection();
if(selection.getPaths() == null)
return;
// delete selected elements
for(TreePath path : selection.getPaths()) {
if(dialogEditSupport.deleteElement(path.getLastSegment())) {
if(rootElements.contains(path.getLastSegment()))
rootElements.remove(path.getLastSegment());
if(selectedElements.contains(path.getLastSegment()))
selectedElements.remove(path.getLastSegment());
gui.getElementTreeViewer().remove(path);
gui.getSelectTreeViewer().remove(path);
gui.getElementTreeViewer().refresh();
gui.getSelectTreeViewer().refresh();
}
}
} catch(Exception e2) {
e2.printStackTrace();
}
}
/** Call edit function on the selected element */
private void editElement() {
if(dialogEditSupport == null)
return;
try {
// find the path to the element
ITreeSelection selection = (ITreeSelection)gui.getElementTreeViewer().getSelection();
if(selection.getPaths() == null || selection.getPaths().length != 1) {
return; // 1 element must be selected
}
TreePath path = selection.getPaths()[0];
dialogEditSupport.editElement(path.getLastSegment());
gui.getElementTreeViewer().refresh();
gui.getSelectTreeViewer().refresh();
} catch(Exception e2) {
e2.printStackTrace();
}
}
/**
* This method can be overwritten by subclasses to accept only elements of a
* certain kind. For not-accepted elements the OK-field is disabled.
*
* The default implementation accepts all elements.
*
* @param element
* the element which is currently selected
*/
public boolean acceptElement(Object element) {
return true;
}
/**
* This method can be overwritten by subclasses to do sth. after selection
*
* @param selectedElement
* @return element after convert
*/
public Object selectConverterAction(Object selectedElement) {
return selectedElement;
}
/**
* This method can be overwritten by subclasses to do sth. after deselection
*
* @param deselectedElement
* @return element after convert
*/
public boolean deselectAction(Object deselectedElement) {
return true;
}
/**
* This method can be overwritten by subclasses to check, if the selected element can be
* selected
*
* @param toSelectedElement
* @return if the toSelectedElement can be selected
*/
public boolean canSelect(Object toSelectedElement) {
return true;
}
/**
* This method can be overwritten by subclasses to check, if the selected element can be
* deselected
*
* @param toDeselectedElement
* @return if the to DeselectedElement can be deselected
*/
public boolean canDeselect(Object toDeselectedElement) {
return true;
}
}
/*--------------------------------------------------------------------------+
$Id: ElementTreeMultiSelectDialogGUI.java 5186 2012-07-27 20:23:37Z ratiu $
| |
| Copyright 2012 ForTISS GmbH |
| |
| Licensed 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.fortiss.tooling.base.ui.dialog;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
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.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.wb.swt.ResourceManager;
/**
* GUI for {@link ElementTreeMultiSelectDialog}
*
* @author kisslinger
* @author $Author: ratiu $
* @version $Rev: 5186 $
* @ConQAT.Rating GREEN Hash: 1DDC1C635607DA6451EF31A1974DF939
*/
public class ElementTreeMultiSelectEditableDialogGUI extends Composite {
/** the left tree viewer */
private TreeViewer elementTreeViewer;
/** the right tree viewer */
private TreeViewer selectTreeViewer;
/** the select button */
private Button selectButton;
/** the deselect button */
private Button deselectButton;
/** GUI Factory */
private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
/** the create button */
private Button createButton;
/** the delete button */
private Button deleteButton;
/** the edit button */
private Button editButton;
/** */
private Composite lefttoolbar;
/** Default Constructor for GUI builder. */
public ElementTreeMultiSelectEditableDialogGUI(Composite parent, int style) {
super(parent, style);
GridLayout gl_container = new GridLayout(4, false);
gl_container.verticalSpacing = 2;
gl_container.marginRight = 5;
gl_container.marginLeft = 5;
gl_container.marginBottom = 5;
gl_container.marginTop = 5;
gl_container.marginWidth = 0;
gl_container.marginHeight = 0;
setLayout(gl_container);
setLayoutData(new GridData(GridData.FILL_BOTH));
lefttoolbar = new Composite(this, SWT.NONE);
lefttoolbar.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, false, true, 1, 1));
GridLayout gl_lefttoolbar = new GridLayout(1, false);
gl_lefttoolbar.verticalSpacing = 2;
gl_lefttoolbar.horizontalSpacing = 2;
gl_lefttoolbar.marginHeight = 0;
gl_lefttoolbar.marginWidth = 0;
lefttoolbar.setLayout(gl_lefttoolbar);
createButton = new Button(lefttoolbar, SWT.NONE);
createButton.setImage(ResourceManager.getPluginImage("org.eclipse.ui",
"/icons/full/obj16/add_obj.gif"));
formToolkit.adapt(createButton, true, true);
deleteButton = new Button(lefttoolbar, SWT.NONE);
deleteButton.setImage(ResourceManager.getPluginImage("org.eclipse.ui",
"/icons/full/obj16/delete_obj.gif"));
formToolkit.adapt(deleteButton, true, true);
editButton = new Button(lefttoolbar, SWT.NONE);
editButton.setImage(ResourceManager.getPluginImage("org.eclipse.ui",
"/icons/full/etool16/editor_area.gif"));
formToolkit.adapt(editButton, true, true);
elementTreeViewer = new TreeViewer(this, SWT.BORDER);
Tree elementTree = elementTreeViewer.getTree();
elementTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite toolbarbox = new Composite(this, SWT.NONE);
GridLayout gl_toolbarbox = new GridLayout(1, false);
gl_toolbarbox.verticalSpacing = 2;
gl_toolbarbox.horizontalSpacing = 2;
gl_toolbarbox.marginHeight = 0;
gl_toolbarbox.marginWidth = 0;
toolbarbox.setLayout(gl_toolbarbox);
toolbarbox.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1));
selectButton = new Button(toolbarbox, SWT.NONE);
selectButton.setText(">>");
deselectButton = new Button(toolbarbox, SWT.NONE);
deselectButton.setText("<<");
selectTreeViewer = new TreeViewer(this, SWT.BORDER);
Tree selectTree = selectTreeViewer.getTree();
selectTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
}
/** Returns elementTreeViewer. */
public TreeViewer getElementTreeViewer() {
return elementTreeViewer;
}
/** Returns selectTreeViewer. */
public TreeViewer getSelectTreeViewer() {
return selectTreeViewer;
}
/** Returns selectButton. */
public Button getSelectButton() {
return selectButton;
}
/** Returns deselectButton. */
public Button getDeselectButton() {
return deselectButton;
}
/** Get the create button */
public Button getCreateButton() {
return createButton;
}
/** Get the delete button */
public Button getDeleteButton() {
return deleteButton;
}
/** Get the edit button */
public Button getEditButton() {
return editButton;
}
/** Get the tool bar */
public Composite getLeftToolBar() {
return lefttoolbar;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment