package kr.co.apexsoft.stella.modeler.explorer.core; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.facet.infra.browser.uicore.internal.AppearanceConfiguration; import org.eclipse.emf.facet.infra.browser.uicore.internal.model.ITreeElement; import org.eclipse.emf.facet.infra.browser.uicore.internal.model.ItemsFactory; import org.eclipse.emf.facet.infra.browser.uicore.internal.model.ModelElementItem; import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor; import org.eclipse.papyrus.infra.core.resource.uml.UmlModel; import org.eclipse.papyrus.infra.core.services.ServicesRegistry; import org.eclipse.papyrus.infra.onefile.utils.OneFileUtils; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IEditorPart; import org.eclipse.uml2.uml.internal.impl.ModelImpl; import org.eclipse.uml2.uml.internal.impl.PackageImpl; public class ApexDIWrapper implements ITreeElement { private IFile _file; private ApexProjectWrapper aProjectWrapper; private ItemsFactory itemsFactory; private final AppearanceConfiguration appearanceConfiguration; public ApexDIWrapper(IFile file, ItemsFactory itemsFactory, AppearanceConfiguration appearanceConfigration) { this._file = file; IContainer container = _file.getParent(); String projectPath = _file.getParent().getLocationURI().getPath(); if ( container instanceof IProject ) { Map<String, ApexProjectWrapper> projectMap = ApexStellaProjectMap.getProjectMap(); aProjectWrapper = projectMap.get(projectPath); } this.itemsFactory = itemsFactory; this.appearanceConfiguration = appearanceConfigration; } public IFile getFile() { return _file; } @Override public String getText() { return _file.getName(); } @Override public Image getImage() { // TODO Auto-generated method stub return null; } @Override public ITreeElement getTreeParent() { return aProjectWrapper; } @Override public boolean hasChildren() { return aProjectWrapper.getChildren().size() > 0; } @Override public List<Object> getChildren() { List<Object> result = new ArrayList<Object>(); if(OneFileUtils.isDi(_file)) { String diFilePath = _file.getLocationURI().getPath(); // 프로젝트 내 di를 최초로 펼친 경우 - (1) // 프로젝트 래퍼가 없고, // diPath에 대한 umlModel 도 없다. // ->에디터 열고 ServiceReg를 가져와 세팅(최초 뷰 구성 시) // 프로젝트 내 di를 한 번 펼친 후 다른 di를 펼친 경우 - (2) // 프로젝트 래퍼는 있고, // diPath에 대한 umlModel은 없다 // ->에디터 열고 ServiceReg를 가져와 세팅(최초 뷰 구성 시) // 에디터 열린상태에서 해당 di나 프로젝트 삭제 시에도 여기를 타므로 // 삭제 시(프로젝트 래퍼는 있고, 내부에 아무런 맵도 없는 경우) createEditorAndSetUpTree()를 호출하지 않도록 처리 // 더블클릭에 의한 refresh() 시 - (3) // 더블클릭 리스너가 직접 Editor를 열고 ServiceReg를 세팅 // 프로젝트 래퍼가 있고, // diPath에 대한 umlModel 도 있다. // 여기선 가져와서 트리 만들어주기만 하믄 됨 // 에디터 닫아서 ApexMEView에서 refresh() 호출된 경우 - (4) // 프로젝트 래퍼는 있고 // diPath에 대한 umlModel은 없다 (2)와 겹침 // 에디터가 닫은 모델은 IsDisposed 가 true 인 것으로 구분 // 그냥 지나친다 if ( aProjectWrapper == null ) { // (1) createEditorAndSetUpTree(_file, result); } else if (aProjectWrapper.getIsDisposed(diFilePath)) { // (4) } else if ( aProjectWrapper.getUmlModel(diFilePath) == null ) { // (2) // if ( aProjectWrapper.getUmlModelMap().size() > 0 ) { // 프로젝트 wrapper에 UmlModelMap이 있는 경우. 즉, diFilePath말고 다른 Key에 대한 UmlModelMap이 있는 경우 // List<String> deletedDiList = aProjectWrapper.getDeletedDIWrapperKeyList(); // boolean isDeleted = false; // boolean canOpen = false; // // if ( deletedDiList.isEmpty() ) { // canOpen = true; // } else { // for ( String deletedDi : deletedDiList ) { // if ( !deletedDi.equals(diFilePath) ) { // canOpen = true; // } else { // isDeleted = true; // } // } // if ( isDeleted ) { // isDeleted = false; // deletedDiList.remove(diFilePath); // } // } // if ( canOpen ) { // createEditorAndSetUpTree(_file, result); // } // } createEditorAndSetUpTree(_file, result); } else { // (3) if ( aProjectWrapper.getDIWrapper(diFilePath) == null ) { aProjectWrapper.put(diFilePath, this); } UmlModel umlModel = aProjectWrapper.getUmlModel(diFilePath); if ( umlModel != null ) { makeModelElementItemList(this, umlModel, result); } } } return result; } @Override public Color getForeground() { // TODO Auto-generated method stub return null; } @Override public Color getBackground() { // TODO Auto-generated method stub return null; } @Override public Font getFont() { // TODO Auto-generated method stub return null; } private void createEditorAndSetUpTree(IFile diFile, List<Object> result) { // ApexProjectWrapper aProjectWrapper = null; String diFilePath = diFile.getLocationURI().getPath(); IEditorPart editor = ApexStellaProjectMap.openEditor(diFile); if ( editor != null && editor instanceof PapyrusMultiDiagramEditor ) { ServicesRegistry servicesRegistry = ((PapyrusMultiDiagramEditor)editor).getServicesRegistry(); // 아래에서 적합한 ProjectWrapper를 받아오므로 파라미터로 aProjectWrapper를 받아올 필요는 없어 보임) aProjectWrapper = ApexStellaProjectMap.setUpModelServices(diFile, servicesRegistry); UmlModel umlModel = aProjectWrapper.getUmlModel(diFilePath); makeModelElementItemList(this, umlModel, result); aProjectWrapper.put(diFilePath, this); // refresh() 하지 않으면 MultiDiagramEditor보다 ExplorerView가 먼저 실행된 경우 // Browser Customization이 작동하지 않음 //viewer.refresh(); } } @SuppressWarnings("restriction") private void makeModelElementItemList(ApexDIWrapper diWrapper, UmlModel umlModel, List<Object> result) { EList<EObject> contents = umlModel.getResource().getContents(); for ( EObject eObj : contents ) { if ( eObj instanceof ModelImpl || eObj instanceof PackageImpl ) { // Control를 통해 분리된 Package의 경우 모델처럼 Tree생성해줘야 함 ModelElementItem aModelElementItem = itemsFactory.createModelElementItem(eObj, null, appearanceConfiguration); aModelElementItem.setTreeParent(diWrapper);// result.add((ITreeElement)aModelElementItem); } } } }