package org.insightech.er.editor.controller.editpart.element;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.SelectionManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.PlatformUI;
import org.insightech.er.ResourceString;
import org.insightech.er.Resources;
import org.insightech.er.db.DBManagerFactory;
import org.insightech.er.editor.controller.editpart.element.node.NodeElementEditPart;
import org.insightech.er.editor.controller.editpolicy.ERDiagramLayoutEditPolicy;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.ViewableModel;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeSet;
import org.insightech.er.editor.model.diagram_contents.element.node.ermodel.ERModel;
import org.insightech.er.editor.model.diagram_contents.element.node.note.Note;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.settings.Settings;
import org.insightech.er.editor.view.property_source.ERDiagramPropertySource;
public class ERDiagramEditPart extends AbstractModelEditPart {
private static boolean updateable = true;
public static void setUpdateable(boolean enabled) {
updateable = enabled;
}
public static boolean isUpdateable() {
return updateable;
}
/**
* {@inheritDoc}
*/
@Override
public void deactivate() {
try {
super.deactivate();
} catch (Throwable t) {
t.printStackTrace();
}
}
/**
* {@inheritDoc}
*/
@Override
protected IFigure createFigure() {
FreeformLayer layer = new FreeformLayer();
layer.setLayoutManager(new FreeformLayout());
return layer;
}
/**
* {@inheritDoc}
*/
@Override
protected void createEditPolicies() {
this.installEditPolicy(EditPolicy.LAYOUT_ROLE,
new ERDiagramLayoutEditPolicy());
}
/**
* {@inheritDoc}
*/
@Override
protected List getModelChildren() {
List<Object> modelChildren = new ArrayList<Object>();
ERDiagram diagram = (ERDiagram) this.getModel();
// modelChildren.addAll(diagram.getDiagramContents().getSettings()
// .getCategorySetting().getSelectedCategories());
modelChildren.add(diagram.getDiagramContents().getSettings()
.getModelProperties());
List<NodeElement> nodeElementList = diagram.getDiagramContents().getContents().getNodeElementList();
for (NodeElement nodeEl : nodeElementList) {
if (nodeEl instanceof Note) {
// Note �͑S�̃r���[�ɂ͒u���Ȃ�
} else {
modelChildren.add(nodeEl);
}
}
if (diagram.getChangeTrackingList().isCalculated()) {
modelChildren.addAll(diagram.getChangeTrackingList()
.getRemovedNodeElementSet());
}
return modelChildren;
}
@Override
@SuppressWarnings("unchecked")
public void doPropertyChange(PropertyChangeEvent event) {
if ("consumed".equals(event.getPropagationId())) {
return;
}
if (event.getPropertyName().equals(NodeSet.PROPERTY_CHANGE_CONTENTS)) {
this.refreshChildren();
} else if (event.getPropertyName().equals(ERModel.PROPERTY_CHANGE_VTABLES)) {
this.refresh();
this.refreshRelations();
} else if (event.getPropertyName().equals(ERDiagram.PROPERTY_CHANGE_ALL)) {
this.refresh();
this.refreshRelations();
List<NodeElement> nodeElementList = (List<NodeElement>) event
.getNewValue();
if (nodeElementList != null) {
this.getViewer().deselectAll();
SelectionManager selectionManager = this.getViewer()
.getSelectionManager();
Map<NodeElement, EditPart> modelToEditPart = getModelToEditPart();
for (NodeElement nodeElement : nodeElementList) {
selectionManager.appendSelection(modelToEditPart
.get(nodeElement));
}
}
} else if (event.getPropertyName().equals(ERDiagram.PROPERTY_CHANGE_ADD)) {
Object newValue = event.getNewValue();
if (newValue instanceof ERModel) {
ERDiagram diagram = (ERDiagram) this.getModel();
// diagram.getDiagramContents().getModelSet().add((ERModel)newValue);
// diagram.addContent((ERModel)newValue);
// diagram.getDiagramContents().getModelSet().
// getModel();
// Set<Entry<NodeElement, EditPart>> entrySet = getModelToEditPart().entrySet();
// refreshChildren();
refresh();
refreshVisuals();
// fireChildAdded(child, index)
// for (Entry<NodeElement, EditPart> entry : entrySet) {
// if (entry.getKey().equals(newValue)) {
// System.out.println("hit!");
// entry.getValue().refresh();
// }
// System.out.println(entry.getKey().getClass());
// }
}
System.out.println("ss22");
// this.internalRefreshTable(newTable);
} else if (event.getPropertyName().equals(ERDiagram.PROPERTY_CHANGE_TABLE)) {
ERTable newTable = (ERTable) event.getNewValue();
this.internalRefreshTable(newTable);
} else if (event.getPropertyName().equals(ViewableModel.PROPERTY_CHANGE_COLOR)) {
this.refreshVisuals();
} else if (event.getPropertyName().equals(ERDiagram.PROPERTY_CHANGE_DATABASE)) {
this.changeDatabase(event);
} else if (event.getPropertyName().equals(ERDiagramPropertySource.PROPERTY_INIT_DATABASE)) {
ERDiagram diagram = (ERDiagram) this.getModel();
diagram.restoreDatabase(DBManagerFactory.getAllDBList().get(0));
} else if (event.getPropertyName().equals(ERDiagram.PROPERTY_CHANGE_SETTINGS)) {
this.changeSettings();
}
}
private void internalRefreshTable(ERTable table) {
// for (ERTable tmpTable : getDiagram().getDiagramContents().getContents().getTableSet()) {
// if (tmpTable.equals(table)) {
// // �e�[�u���̍X�V
// tmpTable.refresh();
// }
// if (tmpTable.getName().equals(table.getName())) {
// // �e�[�u���̍X�V
// entry.getValue().refresh();
// }
//
// }
Set<Entry<NodeElement, EditPart>> entrySet = getModelToEditPart().entrySet();
for (Entry<NodeElement, EditPart> entry : entrySet) {
if (entry.getKey().equals(table)) {
// �e�[�u���̍X�V
entry.getValue().refresh();
}
if (table.getName().equals(entry.getKey().getName())) {
// �e�[�u���̍X�V
entry.getValue().refresh();
}
}
System.out.println("end");
// for (ERModel model : getDiagram().getDiagramContents().getModelSet()) {
// if (model.containsTable(table)) {
//
// }
// }
}
public void refreshRelations() {
for (Object child : this.getChildren()) {
if (child instanceof NodeElementEditPart) {
NodeElementEditPart part = (NodeElementEditPart) child;
part.refreshConnections();
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void refreshVisuals() {
ERDiagram element = (ERDiagram) this.getModel();
int[] color = element.getColor();
if (color != null) {
Color bgColor = Resources.getColor(color);
this.getViewer().getControl().setBackground(bgColor);
}
for (Object child : this.getChildren()) {
if (child instanceof NodeElementEditPart) {
NodeElementEditPart part = (NodeElementEditPart) child;
part.refreshVisuals();
}
}
}
private void changeSettings() {
ERDiagram diagram = (ERDiagram) this.getModel();
Settings settings = diagram.getDiagramContents().getSettings();
for (Object child : this.getChildren()) {
if (child instanceof NodeElementEditPart) {
NodeElementEditPart part = (NodeElementEditPart) child;
part.changeSettings(settings);
}
}
}
private void changeDatabase(PropertyChangeEvent event) {
MessageBox messageBox = new MessageBox(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), SWT.ICON_QUESTION
| SWT.OK | SWT.CANCEL);
messageBox.setText(ResourceString
.getResourceString("dialog.title.change.database"));
messageBox.setMessage(ResourceString
.getResourceString("dialog.message.change.database"));
if (messageBox.open() == SWT.OK) {
event.setPropagationId("consumed");
} else {
ERDiagram diagram = (ERDiagram) this.getModel();
diagram.restoreDatabase(String.valueOf(event.getOldValue()));
}
}
private Map<NodeElement, EditPart> getModelToEditPart() {
Map<NodeElement, EditPart> modelToEditPart = new HashMap<NodeElement, EditPart>();
List children = getChildren();
for (int i = 0; i < children.size(); i++) {
EditPart editPart = (EditPart) children.get(i);
modelToEditPart.put((NodeElement) editPart.getModel(), editPart);
}
return modelToEditPart;
}
}