/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* 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.jkiss.dbeaver.ui.controls;
import org.jkiss.dbeaver.Log;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* PairListControl
*/
public class PairListControl<ELEMENT> extends Composite
{
private static final Log log = Log.getLog(PairListControl.class);
public static final int MOVE_LEFT = 0;
public static final int MOVE_RIGHT = 1;
private Table leftList;
private Table rightList;
private Collection<ELEMENT> leftElements;
private Collection<ELEMENT> rightElements;
private List<ELEMENT> movedElements = new ArrayList<>();
private Font movedFont;
private SelectionListener selListener;
public PairListControl(
Composite parent,
int style,
String leftTitle,
String rightTitle)
{
super(parent, style);
createPairList(leftTitle, rightTitle);
movedFont = UIUtils.modifyFont(getFont(), SWT.ITALIC);
}
public void setModel(Collection<ELEMENT> leftElements, Collection<ELEMENT> rightElements)
{
setListData(leftList, this.leftElements = leftElements);
setListData(rightList, this.rightElements = rightElements);
updateControls();
}
private void createPairList(String leftTitle, String rightTitle)
{
this.setLayout(new GridLayout(3, false));
GridData gd = new GridData(GridData.FILL_BOTH);
this.setLayoutData(gd);
Label leftLabel = new Label(this, SWT.NONE);
leftLabel.setText(leftTitle);
new Label(this, SWT.NONE);
Label rightLabel = new Label(this, SWT.NONE);
rightLabel.setText(rightTitle);
leftList = createList(this);
{
Composite buttonsPane = new Composite(this, SWT.NONE);
gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
gd.minimumWidth = 50;
buttonsPane.setLayoutData(gd);
GridLayout gl = new GridLayout(1, false);
buttonsPane.setLayout(gl);
final Button btnMoveRight = createButton(buttonsPane, DBeaverIcons.getImage(UIIcon.ARROW_RIGHT), new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveElements(true);
}
});
final Button btnMoveRightAll = createButton(buttonsPane, DBeaverIcons.getImage(UIIcon.ARROW_RIGHT_ALL), new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
leftList.selectAll();
moveElements(true);
}
});
final Button btnMoveLeft = createButton(buttonsPane, DBeaverIcons.getImage(UIIcon.ARROW_LEFT), new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
moveElements(false);
}
});
final Button btnMoveLeftAll = createButton(buttonsPane, DBeaverIcons.getImage(UIIcon.ARROW_LEFT_ALL), new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
rightList.selectAll();
moveElements(false);
}
});
createButton(buttonsPane, DBeaverIcons.getImage(UIIcon.ARROW_RESET), new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setListData(leftList, leftElements);
setListData(rightList, rightElements);
}
});
selListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
btnMoveLeft.setEnabled(rightList.getSelectionCount() > 0);
btnMoveLeftAll.setEnabled(rightList.getItemCount() > 0);
btnMoveRight.setEnabled(leftList.getSelectionCount() > 0);
btnMoveRightAll.setEnabled(leftList.getItemCount() > 0);
}
};
btnMoveLeft.setEnabled(false);
btnMoveLeftAll.setEnabled(false);
btnMoveRight.setEnabled(false);
btnMoveRightAll.setEnabled(false);
}
rightList = createList(this);
leftList.addSelectionListener(selListener);
rightList.addSelectionListener(selListener);
leftList.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
moveElements(true);
}
});
rightList.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
moveElements(false);
}
});
}
private Table createList(Composite panel)
{
final Table table = new Table(panel, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
table.setLayoutData(gd);
final TableColumn column = new TableColumn(table, SWT.LEFT);
table.addListener (SWT.Resize, new Listener() {
@Override
public void handleEvent (Event e) {
column.setWidth(table.getClientArea().width);
}
});
return table;
}
private Button createButton(Composite panel, Image label, SelectionListener listener)
{
Button button = new Button(panel, SWT.PUSH);
button.setImage(label);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.addSelectionListener(listener);
return button;
}
private void setListData(Table list, Collection<ELEMENT> elements)
{
list.removeAll();
for (ELEMENT element : elements) {
createListItem(list, element);
}
}
private void updateControls() {
if (selListener != null) {
selListener.widgetSelected(null);
}
}
private TableItem createListItem(Table list, Object element) {
TableItem item = new TableItem(list, SWT.NONE);
item.setData(element);
item.setText(element.toString());
return item;
}
private void moveElements(boolean toRight)
{
Table fromTable = toRight ? leftList : rightList;
Table toTable = toRight ? rightList : leftList;
Collection<ELEMENT> checkList = toRight ? rightElements : leftElements;
List<ELEMENT> movedElements = new ArrayList<>();
for (TableItem item : fromTable.getSelection()) {
ELEMENT element = (ELEMENT) item.getData();
movedElements.add(element);
TableItem newItem = createListItem(toTable, element);
if (!checkList.contains(element)) {
newItem.setFont(movedFont);
}
}
fromTable.remove(fromTable.getSelectionIndices());
updateControls();
Event event = new Event();
event.detail = toRight ? MOVE_RIGHT : MOVE_LEFT;
event.widget = this;
for (ELEMENT element : movedElements) {
event.data = element;
super.notifyListeners(SWT.Modify, event);
}
}
}