package org.insightech.er.editor.view.outline;
import java.util.List;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.dnd.AbstractTransferDragSourceListener;
import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
import org.eclipse.gef.dnd.TemplateTransfer;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.gef.ui.parts.TreeViewer;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.insightech.er.Activator;
import org.insightech.er.editor.ERDiagramEditor;
import org.insightech.er.editor.controller.command.ermodel.OpenERModelCommand;
import org.insightech.er.editor.controller.editpart.outline.ERDiagramOutlineEditPart;
import org.insightech.er.editor.controller.editpart.outline.ERDiagramOutlineEditPartFactory;
import org.insightech.er.editor.controller.editpart.outline.ermodel.ERModelOutlineEditPart;
import org.insightech.er.editor.controller.editpart.outline.ermodel.ERModelSetOutlineEditPart;
import org.insightech.er.editor.controller.editpart.outline.table.TableOutlineEditPart;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.diagram_contents.element.node.ermodel.ERModel;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.view.action.outline.ChangeNameAction;
import org.insightech.er.editor.view.action.outline.index.CreateIndexAction;
import org.insightech.er.editor.view.action.outline.notation.type.ChangeOutlineViewToBothAction;
import org.insightech.er.editor.view.action.outline.notation.type.ChangeOutlineViewToLogicalAction;
import org.insightech.er.editor.view.action.outline.notation.type.ChangeOutlineViewToPhysicalAction;
import org.insightech.er.editor.view.action.outline.orderby.ChangeOutlineViewOrderByLogicalNameAction;
import org.insightech.er.editor.view.action.outline.orderby.ChangeOutlineViewOrderByPhysicalNameAction;
import org.insightech.er.editor.view.action.outline.sequence.CreateSequenceAction;
import org.insightech.er.editor.view.action.outline.tablespace.CreateTablespaceAction;
import org.insightech.er.editor.view.action.outline.trigger.CreateTriggerAction;
import org.insightech.er.editor.view.drag_drop.ERDiagramOutlineTransferDropTargetListener;
import org.insightech.er.editor.view.drag_drop.ERDiagramTransferDragSourceListener;
public class ERDiagramOutlinePage extends ContentOutlinePage {
// �y�[�W���A�E�g���C���ƃT���l�C���ɕ�������R���|�W�b�g
private SashForm sash;
private TreeViewer viewer;
private ERDiagram diagram;
private LightweightSystem lws;
private ScrollableThumbnail thumbnail;
private GraphicalViewer graphicalViewer;
private ActionRegistry outlineActionRegistory;
private ActionRegistry registry;
private boolean quickMode;
private ERDiagramOutlineEditPartFactory editPartFactory;
public ERDiagramOutlinePage(ERDiagram diagram) {
// GEF�c���[�r���[�����g�p����
super(new TreeViewer());
this.viewer = (TreeViewer) this.getViewer();
this.diagram = diagram;
this.outlineActionRegistory = new ActionRegistry();
this.registerAction(this.viewer, outlineActionRegistory);
}
/**
* {@inheritDoc}
*/
@Override
public void createControl(Composite parent) {
this.sash = new SashForm(parent, SWT.VERTICAL);
// �R���X�g���N�^�Ŏw�肵���r���[���̍쐬
this.viewer.createControl(this.sash);
editPartFactory = new ERDiagramOutlineEditPartFactory();
editPartFactory.setQuickMode(quickMode);
this.viewer.setEditPartFactory(editPartFactory);
// �O���t�B�J���E�G�f�B�^�̃��[�g�E���f�����c���[�E�r���[���ɂ��ݒ�
this.viewer.setContents(this.diagram);
if (!quickMode) {
Canvas canvas = new Canvas(this.sash, SWT.BORDER);
// �T���l�C���E�t�B�M���A��z�u����ׂ� LightweightSystem
this.lws = new LightweightSystem(canvas);
}
this.resetView(this.registry);
AbstractTransferDragSourceListener dragSourceListener = new ERDiagramTransferDragSourceListener(
this.viewer, TemplateTransfer.getInstance());
this.viewer.addDragSourceListener(dragSourceListener);
}
/**
* {@inheritDoc}
*/
@Override
public Control getControl() {
// �A�E�g���C���E�r���[���A�N�e�B�u�ɂ������Ƀt�H�[�J�X���ݒ肳���R���g���[����Ԃ�
return sash;
}
private void showThumbnail() {
if (quickMode) {
return;
}
// RootEditPart�̃r���[���\�[�X�Ƃ��ăT���l�C�����쐬
ScalableFreeformRootEditPart editPart = (ScalableFreeformRootEditPart) this.graphicalViewer
.getRootEditPart();
if (this.thumbnail != null) {
this.thumbnail.deactivate();
}
this.thumbnail = new ScrollableThumbnail((Viewport) editPart
.getFigure());
this.thumbnail.setSource(editPart
.getLayer(LayerConstants.PRINTABLE_LAYERS));
this.lws.setContents(this.thumbnail);
}
private void initDropTarget() {
AbstractTransferDropTargetListener dropTargetListener = new ERDiagramOutlineTransferDropTargetListener(
this.graphicalViewer, TemplateTransfer.getInstance());
this.graphicalViewer.addDropTargetListener(dropTargetListener);
}
public void setCategory(EditDomain editDomain,
GraphicalViewer graphicalViewer, MenuManager outlineMenuMgr,
ActionRegistry registry) {
this.graphicalViewer = graphicalViewer;
this.viewer.setContextMenu(outlineMenuMgr);
// �G�f�B�b�g�E�h���C���̐ݒ�
this.viewer.setEditDomain(editDomain);
this.registry = registry;
if (this.getSite() != null) {
this.resetView(registry);
}
}
private void resetAction(ActionRegistry registry) {
// �A�E�g���C���E�y�[�W�ŗL���ɂ���A�N�V����
if (getSite() == null) {
return;
}
IActionBars bars = this.getSite().getActionBars();
String id = ActionFactory.UNDO.getId();
bars.setGlobalActionHandler(id, registry.getAction(id));
id = ActionFactory.REDO.getId();
bars.setGlobalActionHandler(id, registry.getAction(id));
id = ActionFactory.DELETE.getId();
bars.setGlobalActionHandler(id, registry.getAction(id));
bars.updateActionBars();
}
private void resetView(ActionRegistry registry) {
this.showThumbnail();
this.initDropTarget();
this.resetAction(registry);
}
private void registerAction(TreeViewer treeViewer,
ActionRegistry actionRegistry) {
IAction[] actions = { new CreateIndexAction(treeViewer),
new CreateSequenceAction(treeViewer),
new CreateTriggerAction(treeViewer),
new CreateTablespaceAction(treeViewer),
new ChangeOutlineViewToPhysicalAction(treeViewer),
new ChangeOutlineViewToLogicalAction(treeViewer),
new ChangeOutlineViewToBothAction(treeViewer),
new ChangeOutlineViewOrderByPhysicalNameAction(treeViewer),
new ChangeOutlineViewOrderByLogicalNameAction(treeViewer),
new ChangeNameAction(treeViewer),
};
for (IAction action : actions) {
actionRegistry.registerAction(action);
}
}
public ActionRegistry getOutlineActionRegistory() {
return outlineActionRegistory;
}
@Override
public EditPartViewer getViewer() {
return super.getViewer();
}
public void update() {
viewer.flush();
// gettr
// if (model != null) {
// try {
// model.update(editor.getDocumentProvider()
// .getDocument(editor.getEditorInput()).get());
// } catch (Throwable t) {
// t.printStackTrace();
// }
// }
}
public void setFilterText(String filterText) {
editPartFactory.setFilterText(filterText);
viewer.setContents(diagram);
Tree tree = (Tree)viewer.getControl();
TreeItem[] items = tree.getItems();
expand(items);
TreeItem[] tableItems = items[0].getItems();
if (tableItems.length >= 1) {
tree.setSelection(tableItems[0]);
}
// viewer.getContents().getChildren();
// viewer.flush();
// viewer.getEditPartFactory()
// if (filterText == null) {
// filterText = "";
// }
// this.filterText = filterText;
// getTreeViewer().refresh();
// getTreeViewer().expandAll();
// JavaScriptElement element = getFirstElement(model, filterText);
// if(element != null){
// getViewer().setSelection(new StructuredSelection(element), true);
// }
}
private void expand(TreeItem[] items) {
for (int i = 0; i < items.length; i++) {
expand(items[i].getItems());
items[i].setExpanded(true);
}
}
/**
* quickMode��ݒ肵�܂��B
* @param quickMode quickMode
*/
public void setQuickMode(boolean quickMode) {
this.quickMode = quickMode;
}
public void selectSelection() {
IStructuredSelection sel = (IStructuredSelection) getViewer().getSelection();
Object firstElement = sel.getFirstElement();
if (firstElement instanceof ERDiagramOutlineEditPart) {
Tree tree = (Tree)viewer.getControl();
TreeItem[] items = tree.getItems();
expand(items);
TreeItem[] tableItems = items[0].getItems();
if (tableItems.length >= 1) {
Object data = tableItems[0].getData();
firstElement = data;
}
}
if (firstElement instanceof TableOutlineEditPart) {
Object model = ((TableOutlineEditPart)firstElement).getModel();
ERTable table = (ERTable) model;
if (diagram.getCurrentErmodel() == null) {
// �S�̃r���[
ERDiagramEditor editor = ((ERDiagramEditor) diagram.getEditor().getActiveEditor());
editor.reveal(table);
return;
}
ERModel erModel = table.getDiagram().findModelByTable(table);
if (erModel != null) {
OpenERModelCommand command = new OpenERModelCommand(diagram, erModel);
command.setTable(table);
this.getViewer().getEditDomain().getCommandStack().execute(command);
// �A�E�g���C���r���[�̗v�f��I��
ERDiagramOutlineEditPart contents = (ERDiagramOutlineEditPart) diagram.getEditor().getOutlinePage().getViewer().getContents();
if (contents != null) {
List<ERModelOutlineEditPart> parts = ((ERModelSetOutlineEditPart) contents.getChildren().get(0)).getChildren();
for (ERModelOutlineEditPart part : parts) {
if (part.getModel().equals(erModel)) {
ISelection selection = new StructuredSelection(part);
diagram.getEditor().getOutlinePage().setSelection(selection);
}
}
}
} else {
Activator.showMessageDialog(table.getPhysicalName() + " �e�[�u���͂��̃_�C�A�O�����ɂ��z�u����Ă��܂���B");
}
}
}
}