package org.insightech.er.editor; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringTokenizer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.gef.ui.actions.ZoomComboContributionItem; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.MultiPageEditorPart; import org.insightech.er.Activator; import org.insightech.er.ResourceString; import org.insightech.er.db.DBManagerFactory; import org.insightech.er.editor.controller.command.category.ChangeCategoryNameCommand; import org.insightech.er.editor.controller.editpart.element.ERDiagramEditPartFactory; import org.insightech.er.editor.model.ERDiagram; import org.insightech.er.editor.model.dbexport.ddl.validator.ValidateResult; import org.insightech.er.editor.model.dbexport.ddl.validator.Validator; import org.insightech.er.editor.model.diagram_contents.element.node.category.Category; 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.model.diagram_contents.element.node.table.column.NormalColumn; import org.insightech.er.editor.model.diagram_contents.element.node.table.index.Index; import org.insightech.er.editor.model.diagram_contents.element.node.view.View; import org.insightech.er.editor.model.diagram_contents.not_element.sequence.Sequence; import org.insightech.er.editor.model.diagram_contents.not_element.trigger.Trigger; import org.insightech.er.editor.persistent.Persistent; import org.insightech.er.editor.view.dialog.category.CategoryNameChangeDialog; import org.insightech.er.editor.view.outline.ERDiagramOutlinePage; import org.insightech.er.util.Format; /** * <pre> * �G�f�B�^�[�N���X * �J�e�S���[���Ƀ^�u�i�y�[�W�j���쐬���� * �e�^�u�i�y�[�W�j�ɂ́A{@link ERDiagramEditor} �����蓖�Ă� * </pre> */ public class ERDiagramMultiPageEditor extends MultiPageEditorPart { private ERDiagram diagram; private ERDiagramEditPartFactory editPartFactory; private ZoomComboContributionItem zoomComboContributionItem; private ERDiagramOutlinePage outlinePage; private ERDiagramElementStateListener fElementStateListener; private boolean dirty; @Override public boolean isDirty() { if (this.dirty) { return true; } return super.isDirty(); } /** * {@inheritDoc} */ @Override protected void createPages() { try { IFile file = ((IFileEditorInput) getEditorInput()).getFile(); this.setPartName(file.getName()); Persistent persistent = Persistent.getInstance(); if (!file.isSynchronized(IResource.DEPTH_ONE)) { file.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor()); } InputStream in = file.getContents(); System.out.println(new Date() + " : load start"); this.diagram = persistent.load(in); System.out.println(new Date() + " : load end"); } catch (Exception e) { Activator.showExceptionDialog(e); } System.out.println(new Date() + " : A"); if (this.diagram == null) { this.diagram = new ERDiagram(DBManagerFactory.getAllDBList().get(0)); this.diagram.init(); } System.out.println(new Date() + " : B"); this.diagram.getDiagramContents().getSettings().getTranslationSetting() .load(); System.out.println(new Date() + " : C"); this.diagram.setEditor(this); this.editPartFactory = new ERDiagramEditPartFactory(); this.outlinePage = new ERDiagramOutlinePage(this.diagram); System.out.println(new Date() + " : D"); try { this.zoomComboContributionItem = new ZoomComboContributionItem(this .getSite().getPage()); ERDiagramEditor editor = new ERDiagramEditor(diagram, this.editPartFactory, zoomComboContributionItem, this.outlinePage); int index = this.addPage(editor, this.getEditorInput()); this.setPageText(index, ResourceString.getResourceString("label.all")); } catch (PartInitException e) { Activator.showExceptionDialog(e); } System.out.println(new Date() + " : E"); this.initCategoryPages(); // ���ꂪ5�b�|���� System.out.println(new Date() + " : F"); this.initStartPage(); // ���ꂪ9�b�|���� System.out.println(new Date() + " : G"); this.addMouseListenerToTabFolder(); System.out.println(new Date() + " : H"); this.validate(); if (diagram.getCurrentErmodel() == null) { ERDiagramEditor diagramEditor = (ERDiagramEditor) this.getActiveEditor(); diagramEditor.getGraphicalViewer().setContents(diagram); } } private void initStartPage() { // System.out.println(new Date() + " : F1"); // int categoryIndex = this.diagram.getCurrentCategoryIndex(); // System.out.println(new Date() + " : F2"); // this.setActivePage(categoryIndex); // // System.out.println(new Date() + " : F3"); // if (categoryIndex > 0) { // this.pageChange(categoryIndex); // } ERModel model = diagram.getCurrentErmodel(); if (model != null) { setActivePage(1); } else { setActivePage(0); // ERDiagramEditor diagramEditor = (ERDiagramEditor) this.getActiveEditor(); // diagramEditor.getGraphicalViewer().setContents(diagram); } ERDiagramEditor activeEditor = (ERDiagramEditor) this.getActiveEditor(); ZoomManager zoomManager = (ZoomManager) activeEditor .getAdapter(ZoomManager.class); zoomManager.setZoom(this.diagram.getZoom()); activeEditor.setLocation(this.diagram.getX(), this.diagram.getY()); } /** * {@inheritDoc} */ @Override protected Composite createPageContainer(Composite parent) { try { IWorkbenchPage page = this.getSite().getWorkbenchWindow() .getActivePage(); if (page != null) { page.showView(IPageLayout.ID_OUTLINE); } } catch (PartInitException e) { Activator.showExceptionDialog(e); } return super.createPageContainer(parent); } public void initCategoryPages() { String modelName = diagram.getDefaultModelName(); if (modelName != null) { try { ERModel model = diagram.getDiagramContents().getModelSet().getModel(modelName); diagram.setCurrentErmodel(model, model.getName()); EROneDiagramEditor modelEditor = new EROneDiagramEditor( this.diagram, model, this.editPartFactory, this.zoomComboContributionItem, this.outlinePage); int pageNo = this.addPage(modelEditor, this.getEditorInput()); this.setPageText(pageNo, Format.null2blank(model.getName())); // IServiceLocator pageSite = getPageSite(pageNo); // System.out.println(pageSite); // MultiPageEditorSite site = ((IMultiPageEditorSiteHolder)pageSite.getService(IMultiPageEditorSiteHolder.class)).getSite(); // MenuManager menuManager = new MenuManager(); } catch (PartInitException e) { Activator.showExceptionDialog(e); } } // �J�e�S���\���͖����� // CategorySetting categorySettings = this.diagram.getDiagramContents() // .getSettings().getCategorySetting(); // System.out.println(new Date() + " : E1"); // // List<Category> selectedCategories = categorySettings // .getSelectedCategories(); // System.out.println(new Date() + " : E2"); // // if (this.getPageCount() > selectedCategories.size() + 1) { // while (this.getPageCount() > selectedCategories.size() + 1) { // IEditorPart editorPart = this.getEditor(selectedCategories // .size() + 1); // editorPart.dispose(); // this.removePage(selectedCategories.size() + 1); // } // } // System.out.println(new Date() + " : E3"); // // try { // for (int i = 1; i < this.getPageCount(); i++) { // Category category = selectedCategories.get(i - 1); // this.setPageText(i, Format.null2blank(category.getName())); // } // System.out.println(new Date() + " : E4"); // // for (int i = this.getPageCount(); i < selectedCategories.size() + 1; i++) { // Category category = selectedCategories.get(i - 1); // // ERDiagramEditor diagramEditor = new ERDiagramEditor( // this.diagram, this.editPartFactory, // this.zoomComboContributionItem, this.outlinePage); // // this.addPage(diagramEditor, this.getEditorInput()); // this.setPageText(i, Format.null2blank(category.getName())); // } // // } catch (PartInitException e) { // Activator.showExceptionDialog(e); // } } /** * {@inheritDoc} */ @Override public void doSave(IProgressMonitor monitor) { monitor.setTaskName("save initialize..."); ZoomManager zoomManager = (ZoomManager) this.getActiveEditor() .getAdapter(ZoomManager.class); double zoom = zoomManager.getZoom(); this.diagram.setZoom(zoom); ERDiagramEditor activeEditor = (ERDiagramEditor) this.getActiveEditor(); Point location = activeEditor.getLocation(); this.diagram.setLocation(location.x, location.y); Persistent persistent = Persistent.getInstance(); IFile file = ((IFileEditorInput) this.getEditorInput()).getFile(); try { monitor.setTaskName("create stream..."); diagram.getDiagramContents().getSettings().getModelProperties() .setUpdatedDate(new Date()); InputStream source = persistent.createInputStream(this.diagram); if (!file.exists()) { file.create(source, true, monitor); } else { file.setContents(source, true, false, monitor); } } catch (Exception e) { Activator.showExceptionDialog(e); } monitor.beginTask("saving...", this.getPageCount()); for (int i = 0; i < this.getPageCount(); i++) { IEditorPart editor = this.getEditor(i); editor.doSave(monitor); monitor.worked(i + 1); } monitor.done(); monitor.setTaskName("finalize..."); validate(); monitor.done(); } /** * {@inheritDoc} */ @Override public void doSaveAs() { } /** * {@inheritDoc} */ @Override public boolean isSaveAsAllowed() { return false; } /** * {@inheritDoc} */ @Override protected void pageChange(int newPageIndex) { super.pageChange(newPageIndex); for (int i = 0; i < this.getPageCount(); i++) { ERDiagramEditor editor = (ERDiagramEditor) this.getEditor(i); editor.removeSelection(); } ERDiagramEditor selectedEditor = (ERDiagramEditor) this .getActiveEditor(); selectedEditor.changeCategory(); if (selectedEditor instanceof EROneDiagramEditor) { EROneDiagramEditor editor = (EROneDiagramEditor) selectedEditor; this.diagram.setCurrentErmodel(editor.getModel(), editor.getModel().getName()); } else { this.diagram.setCurrentErmodel(null, null); this.diagram.changeAll(); // Category category = this.getCurrentPageCategory(); // this.diagram.setCurrentCategory(category, 0); // ��ɑS�̕\���i�����ŃA�E�g���C���쐬�j // this.diagram.setCurrentErmodel(null, null); } } /** * {@inheritDoc} */ @Override public IEditorPart getActiveEditor() { return super.getActiveEditor(); } public Category getCurrentPageCategory() { // List<Category> categories = diagram.getDiagramContents().getSettings() // .getCategorySetting().getSelectedCategories(); return null; // �J�e�S���̊T�O�͖����� // int page = this.getActivePage(); // // if (page == 0) { // return null; // } // // return categories.get(page - 1); } /** * {@inheritDoc} */ @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { super.init(site, input); this.fElementStateListener = new ERDiagramElementStateListener(this); } /** * {@inheritDoc} */ @Override public void dispose() { this.fElementStateListener.disposeDocumentProvider(); super.dispose(); } /** * {@inheritDoc} */ @Override protected void setInputWithNotify(IEditorInput input) { super.setInputWithNotify(input); } private void validate() { final IFile file = ((IFileEditorInput) this.getEditorInput()).getFile(); if (this.diagram.getDiagramContents().getSettings() .isSuspendValidator()) { try { file.deleteMarkers(null, true, IResource.DEPTH_INFINITE); } catch (CoreException e) { Activator.showExceptionDialog(e); } } else { IWorkspaceRunnable editorMarker = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { ERDiagramEditor editor = (ERDiagramEditor) getActiveEditor(); file.deleteMarkers(null, true, IResource.DEPTH_INFINITE); editor.clearMarkedObject(); Validator validator = new Validator(); List<ValidateResult> errorList = validator .validate(diagram); for (ValidateResult error : errorList) { IMarker marker = file.createMarker(IMarker.PROBLEM); marker.setAttribute(IMarker.MESSAGE, error.getMessage()); marker.setAttribute(IMarker.TRANSIENT, true); marker.setAttribute(IMarker.LOCATION, error.getLocation()); marker.setAttribute(IMarker.SEVERITY, error.getSeverity()); editor.setMarkedObject(marker, error.getObject()); } List<ValidateResult> todoList = validateTodo(); for (ValidateResult todo : todoList) { IMarker marker = file.createMarker(IMarker.TASK); marker.setAttribute(IMarker.MESSAGE, todo.getMessage()); marker.setAttribute(IMarker.TRANSIENT, true); marker.setAttribute(IMarker.LOCATION, todo.getLocation()); marker.setAttribute(IMarker.SEVERITY, todo.getSeverity()); editor.setMarkedObject(marker, todo.getObject()); } } }; try { ResourcesPlugin.getWorkspace().run(editorMarker, null); } catch (CoreException e) { Activator.showExceptionDialog(e); } } } private List<ValidateResult> validateTodo() { List<ValidateResult> resultList = new ArrayList<ValidateResult>(); for (ERTable table : this.diagram.getDiagramContents().getContents() .getTableSet()) { String description = table.getDescription(); resultList.addAll(this.createTodo(description, table.getLogicalName(), table)); for (NormalColumn column : table.getNormalColumns()) { description = column.getDescription(); resultList.addAll(this.createTodo(description, table.getLogicalName(), table)); } for (Index index : table.getIndexes()) { description = index.getDescription(); resultList.addAll(this.createTodo(description, index.getName(), index)); } } for (View view : this.diagram.getDiagramContents().getContents() .getViewSet().getList()) { String description = view.getDescription(); resultList .addAll(this.createTodo(description, view.getName(), view)); for (NormalColumn column : view.getNormalColumns()) { description = column.getDescription(); resultList.addAll(this.createTodo(description, view.getLogicalName(), view)); } } for (Trigger trigger : this.diagram.getDiagramContents() .getTriggerSet().getTriggerList()) { String description = trigger.getDescription(); resultList.addAll(this.createTodo(description, trigger.getName(), trigger)); } for (Sequence sequence : this.diagram.getDiagramContents() .getSequenceSet().getSequenceList()) { String description = sequence.getDescription(); resultList.addAll(this.createTodo(description, sequence.getName(), sequence)); } return resultList; } private List<ValidateResult> createTodo(String description, String location, Object object) { List<ValidateResult> resultList = new ArrayList<ValidateResult>(); if (description != null) { StringTokenizer tokenizer = new StringTokenizer(description, "\n\r"); while (tokenizer.hasMoreElements()) { String token = tokenizer.nextToken(); int startIndex = token.indexOf("// TODO"); if (startIndex != -1) { String message = token.substring( startIndex + "// TODO".length()).trim(); ValidateResult result = new ValidateResult(); result.setLocation(location); result.setMessage(message); result.setObject(object); resultList.add(result); } } } return resultList; } // @Override // protected void setActivePage(int pageIndex) { // System.out.println("setActivePage : " + pageIndex); // viewer.setContents(diagram); // �Ƃ肠����OFF���Ă݂� // // // TODO Auto-generated method stub // super.setActivePage(pageIndex); // } public void setCurrentCategoryPageName() { Category category = this.getCurrentPageCategory(); this.setPageText(this.getActivePage(), Format.null2blank(category.getName())); } private void addMouseListenerToTabFolder() { CTabFolder tabFolder = (CTabFolder) this.getContainer(); tabFolder.addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent mouseevent) { Category category = getCurrentPageCategory(); if (category != null) { CategoryNameChangeDialog dialog = new CategoryNameChangeDialog( PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), category); if (dialog.open() == IDialogConstants.OK_ID) { ChangeCategoryNameCommand command = new ChangeCategoryNameCommand( diagram, category, dialog.getCategoryName()); execute(command); } } super.mouseDoubleClick(mouseevent); } }); } private void execute(Command command) { ERDiagramEditor selectedEditor = (ERDiagramEditor) this .getActiveEditor(); selectedEditor.getGraphicalViewer().getEditDomain().getCommandStack() .execute(command); } /** * {@inheritDoc} */ @Override public Object getAdapter(Class type) { if (type == ERDiagram.class) { return this.diagram; } return super.getAdapter(type); } /** * editPartFactory���擾���܂��B * * @return editPartFactory */ public ERDiagramEditPartFactory getEditPartFactory() { return editPartFactory; } /** * zoomComboContributionItem���擾���܂��B * * @return zoomComboContributionItem */ public ZoomComboContributionItem getZoomComboContributionItem() { return zoomComboContributionItem; } /** * outlinePage���擾���܂��B * * @return outlinePage */ public ERDiagramOutlinePage getOutlinePage() { return outlinePage; } public int addPage(IEditorPart editor, IEditorInput input, String name) throws PartInitException { int pageNo = super.addPage(editor, input); setPageText(pageNo, Format.null2blank(name)); return pageNo; } public void setDirty(boolean dirty) { this.dirty = dirty; } public void setCurrentErmodel(ERModel model) { // �Ƃ肠�����̓G�f�B�^��2�^�u�Œ�ŁApageNo=0 ���S�́A=1���r���[�iERModel�j�Ƃ��� if (getPageCount() == 1) { // 1�‚����̏ꍇ�́A�V�����G�f�B�^���쐬���� EROneDiagramEditor diagramEditor = new EROneDiagramEditor( this.diagram, model, getEditPartFactory(), getZoomComboContributionItem(), getOutlinePage()); try { addPage(diagramEditor, getEditorInput(), model.getName()); setActiveEditor(diagramEditor); } catch (PartInitException e) { Activator.showExceptionDialog(e); } } else { EROneDiagramEditor diagramEditor = (EROneDiagramEditor) getEditor(1); setPageText(1, Format.null2blank(model.getName())); diagramEditor.setContents(model); model.getDiagram().setCurrentErmodel(model, model.getName()); setActiveEditor(diagramEditor); } } public void initGroupPages() { // TODO Auto-generated method stub } }