/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.grid.tree;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import com.hundsun.ares.studio.core.model.ICreateInstance;
import com.hundsun.ares.studio.ui.editor.AbstractHSFormEditor;
import com.hundsun.ares.studio.ui.util.Clipboard;
/**
*
* ��һ����ҪΪΪ���༭�������˶��� �� �˵� �縴�� �����
*
* @author gongyf
*
* @param <T>
*/
public abstract class GridTreeViewerExComponent<T> extends GridTreeViewerEditorableComponent<T> {
/**
* �Ƿ�ɿ���
*
* @return
*/
public boolean canCopy() {
// ѡ��Ķ�����Ҫ��ͬһ���ͣ���ʵ����ICreateInstance�ӿ�
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
// ��Ҫ��ѡ�����Ŀ
if (paths.length == 0) {
return false;
}
// ��Ҫ���Կ�¡��
if (!(paths[0].getLastSegment() instanceof ICreateInstance)) {
return false;
}
// ��Ҫѡ�����Ŀ��һ������
Class<?> cls = paths[0].getLastSegment().getClass();
for (TreePath path : paths) {
if (path.getLastSegment().getClass() != cls) {
return false;
}
}
return true;
}
/**
* �Ƿ�ɼ���
*
* @return
*/
public boolean canCut() {
return canCopy() && canDelete();
}
/**
* �Ƿ��ɾ��
*
* @return
*/
public boolean canDelete() {
if (readOnly) {
return false;
}
// �����и�λ�ñ�ѡ��
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
if (paths.length == 0) {
return false;
}
return true;
}
/**
* �Ƿ�ɲ���
*
* @return
*/
public boolean canInsert() {
return !readOnly && ((ITreeSelection) viewer.getSelection()).getPaths().length > 0;
}
/**
* �Ƿ��ճ��
*
* @return
*/
public boolean canPaste() {
if (readOnly) {
return false;
}
// �����и�λ�ñ�ѡ��
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
if (paths.length == 0) {
return false;
}
// ���������
Object objTest = paths[0].getLastSegment();
// ��Ҫ�����岻Ϊ�գ��������뵱ǰλ�õ�����һ��
Object obj = Clipboard.instance.getData();
if (obj != null && obj instanceof List) {
// ��������ճ������
if (!((List) obj).isEmpty()) {
if (((List) obj).get(0).getClass() == objTest.getClass()) {
return true;
}
}
}
return false;
}
/**
* ���и��Ʋ���
*/
public void copy() {
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
ArrayList<Object> copied = new ArrayList<Object>();
for (TreePath path : paths) {
copied.add(path.getLastSegment());
}
// ���������
Clipboard.instance.setData(copied);
}
@Override
final public Composite create(FormToolkit toolkit, Composite parent) {
Composite client = null;
if (toolkit == null) {
client = new Composite(parent, SWT.NONE);
} else {
client = toolkit.createComposite(parent);
}
GridLayout layout = new GridLayout();
layout.numColumns = 2;
client.setLayout(layout);
client.setLayoutData(new GridData(GridData.FILL_BOTH));
// ��ʼ���ؼ�
initComposite(client);
buttons = createButtons(toolkit, client);
initTreeMenu();
int size = buttons.size();
// �������
((GridData) filteredTree.getLayoutData()).verticalSpan = size > 0 ? size : 1;
return client;
}
/**
* ������
*/
public void cut() {
copy();
deleteWithOutConfirmed();
}
/**
*
* ����ɾ������
*/
public void delete() {
boolean confirmed = MessageDialog.openConfirm(viewer.getGrid().getShell(), "", "ȷʵҪɾ����?");
if (!confirmed) {
return;
}
deleteWithOutConfirmed();
}
/**
* ����ɾ������
*/
public void deleteWithOutConfirmed() {
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
if (paths.length > 0) {
// ������·���̵���ǰ��
Arrays.sort(paths, new Comparator<TreePath>() {
public int compare(TreePath o1, TreePath o2) {
return o1.getSegmentCount() - o2.getSegmentCount();
}
});
GridTreeDeleteItemOperation operation = new GridTreeDeleteItemOperation("", this, paths);
operation.addContext(undoContext);
try {
AbstractHSFormEditor.getOperationHistory().execute(operation, null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected int treeColumn = 0;
@Override
protected void initComposite(Composite client) {
adjustStyle();
super.initComposite(client);
if (treeColumn >= 0 && viewer.getGrid().getColumnCount() > treeColumn) {
if (viewer.getGrid().getColumn(treeColumn) != null) {
viewer.getGrid().getColumn(treeColumn).setTree(true);
}
}
viewer.getGrid().addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e.keyCode == 'c' && e.stateMask == SWT.CTRL) {
if (canCopy()) {
copy();
}
} else if (e.keyCode == 'x' && e.stateMask == SWT.CTRL) {
if (canCut()) {
cut();
}
} else if (e.keyCode == 'v' && e.stateMask == SWT.CTRL) {
if (canPaste()) {
paste();
}
} else if (e.keyCode == SWT.DEL) {
if (canDelete()) {
delete();
}
} else if (e.keyCode == 'a' && e.stateMask == SWT.CTRL) {
viewer.getGrid().selectAll();
} else if (e.keyCode == SWT.INSERT) {
if (canInsert()) {
insert();
}
} else if (e.keyCode == SWT.F5) {
viewer.refresh();
}
}
public void keyReleased(KeyEvent e) {
}
});
}
/**
* ��ʼ���˵����������ʵ�ָ÷��������Լ��IJ˵�
*/
protected void initTreeMenu() {
// ��Ӹ��ƣ�ճ����ɾ��
GridTreeViewerActionGroup group = new GridTreeViewerActionGroup(this);
group.fillContextMenu(new MenuManager());
}
/**
* ��������
*/
public void insert() {
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
TreePath parentPath = paths[0].getParentPath();
List addItems = new ArrayList();
addItems.add(createBlankData(parentPath.getLastSegment()));
GridTreeAddItemOperation operation = new GridTreeAddItemOperation("add", this, paths, addItems);
operation.addContext(undoContext);
try {
AbstractHSFormEditor.getOperationHistory().execute(operation, null, null);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
/**
* ����ճ������
*/
public void paste() {
ITreeSelection sel = (ITreeSelection) viewer.getSelection();
TreePath[] paths = sel.getPaths();
List<Object> objs = (List) Clipboard.instance.getData();
GridTreeAddItemOperation operation = new GridTreeAddItemOperation("", this, paths, objs);
operation.addContext(undoContext);
try {
AbstractHSFormEditor.getOperationHistory().execute(operation, null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}