diff --git a/repository/BaselineOfOpenPonk/BaselineOfOpenPonk.class.st b/repository/BaselineOfOpenPonk/BaselineOfOpenPonk.class.st index 33073aae..0798e562 100644 --- a/repository/BaselineOfOpenPonk/BaselineOfOpenPonk.class.st +++ b/repository/BaselineOfOpenPonk/BaselineOfOpenPonk.class.st @@ -1,6 +1,6 @@ " -I am baseline for the core and all-in-one dynacase. -https://dynacase.github.io/ +I am baseline for the core of Openponk. +https://openponk.org/ " Class { #name : 'BaselineOfOpenPonk', @@ -37,7 +37,7 @@ BaselineOfOpenPonk >> externalProjectsBaseline: spec [ spec baseline: 'XPath' with: [ - spec repository: 'github://pharo-contributions/XML-XPath:2aa720c' ]. + spec repository: 'github://pharo-contributions/XML-XPath:v2.3.x' ]. spec baseline: 'Magritte' with: [ spec diff --git a/repository/OpenPonk-Core/OPController.class.st b/repository/OpenPonk-Core/OPController.class.st index c7d86a0d..64dd40e8 100644 --- a/repository/OpenPonk-Core/OPController.class.st +++ b/repository/OpenPonk-Core/OPController.class.st @@ -364,3 +364,9 @@ OPController >> updateAfterDiagramFocused [ self subclassResponsibility ] + +{ #category : 'validation' } +OPController >> validate [ + + "do nothing by default" +] diff --git a/repository/OpenPonk-Core/OPDiagramController.class.st b/repository/OpenPonk-Core/OPDiagramController.class.st index 6bc5baf6..1fa94ff7 100644 --- a/repository/OpenPonk-Core/OPDiagramController.class.st +++ b/repository/OpenPonk-Core/OPDiagramController.class.st @@ -760,7 +760,8 @@ OPDiagramController >> showDiagramElement: aDiagramElement [ ifFound: [ :ctrl | ctrl isRendered ifTrue: [ aDiagramElement isRendered ifTrue: [ ^ ctrl ]. - ^ self error: 'Controller is already rendered' ]. + ^ self error: + 'Controller is already rendered by a different diagram element' ]. ctrl ] ifNone: [ self newControllerFor: @@ -840,6 +841,12 @@ OPDiagramController >> updateView [ ^ self updateCanvas ] +{ #category : 'validation' } +OPDiagramController >> validate [ + + self controllers do: [ :each | each validate ] +] + { #category : 'accessing' } OPDiagramController >> view [ diff --git a/repository/OpenPonk-Core/OPElementController.class.st b/repository/OpenPonk-Core/OPElementController.class.st index 1a41a6d1..49d439c7 100644 --- a/repository/OpenPonk-Core/OPElementController.class.st +++ b/repository/OpenPonk-Core/OPElementController.class.st @@ -215,6 +215,7 @@ OPElementController >> renderFigureIn: aCanvas [ { #category : 'construction' } OPElementController >> showWithoutDependentInDiagram: aDiagramController [ + self validate. self ensureShownDependenciesInDiagram: aDiagramController. aDiagramController addController: self. self ensureDiagramElement. diff --git a/repository/OpenPonk-Core/OPModelInvalid.class.st b/repository/OpenPonk-Core/OPModelInvalid.class.st new file mode 100644 index 00000000..b1f8c955 --- /dev/null +++ b/repository/OpenPonk-Core/OPModelInvalid.class.st @@ -0,0 +1,7 @@ +Class { + #name : 'OPModelInvalid', + #superclass : 'Warning', + #category : 'OpenPonk-Core-Controllers', + #package : 'OpenPonk-Core', + #tag : 'Controllers' +} diff --git a/repository/OpenPonk-Core/OPProjectController.class.st b/repository/OpenPonk-Core/OPProjectController.class.st index cd35edfa..132dda1d 100644 --- a/repository/OpenPonk-Core/OPProjectController.class.st +++ b/repository/OpenPonk-Core/OPProjectController.class.st @@ -395,15 +395,16 @@ OPProjectController >> selectInDiagram: aModelElement [ OPProjectController >> updateDiagram: aDiagram [ | focusedController | - focusedController := workbench focusedEditor ifNotNil: [ :editor | + controllers do: [ :each | each validate ]. + focusedController := workbench focusedEditor ifNotNil: [ :editor | editor diagramController ]. controllers detect: [ :ctrl | ctrl diagramElement = aDiagram ] - ifFound: [ :ctrl | + ifFound: [ :ctrl | aDiagram isOpen: true. aDiagram isRendered ifTrue: [ aDiagram updateFromRender ]. aDiagram isSelected: ctrl = focusedController ] - ifNone: [ + ifNone: [ aDiagram isOpen: false; isSelected: false ] diff --git a/repository/OpenPonk-Core/OPShape.class.st b/repository/OpenPonk-Core/OPShape.class.st index dab3b030..6da8dbac 100644 --- a/repository/OpenPonk-Core/OPShape.class.st +++ b/repository/OpenPonk-Core/OPShape.class.st @@ -271,6 +271,8 @@ OPShape >> modelElement [ OPShape >> modelElement: anObject [ anObject ifNil: [ ^ self modelElements: #( ) ]. + (self modelElements size = 1 and: [ + self modelElements first == anObject ]) ifTrue: [ ^ self ]. self modelElements: { anObject } ] @@ -319,6 +321,7 @@ OPShape >> ownedElement: aShape renderedIn: aCanvas [ { #category : 'accessing' } OPShape >> ownedElements [ + ^ ownedElements ] diff --git a/repository/OpenPonk-Spec/OPEditor.class.st b/repository/OpenPonk-Spec/OPEditor.class.st index 0656ed0f..f12e4f06 100644 --- a/repository/OpenPonk-Spec/OPEditor.class.st +++ b/repository/OpenPonk-Spec/OPEditor.class.st @@ -262,7 +262,7 @@ OPEditor >> setModelBeforeInitialization: aPlugin [ ] { #category : 'updating' } -OPEditor >> tabDeleted [ +OPEditor >> tabClosed [ self workbench projectController updateDiagram: diagramController diagramElement. @@ -271,6 +271,17 @@ OPEditor >> tabDeleted [ diagramController removeRender ] +{ #category : 'updating' } +OPEditor >> tabClosedWhileClosingWorkbench: discardingChanges [ + + discardingChanges ifTrue: [ ^ self ]. + self workbench projectController updateDiagram: + diagramController diagramElement. + self workbench projectController removeDiagramController: + diagramController. + diagramController removeRender +] + { #category : 'updating' } OPEditor >> updateUndoRedo [ self flag: #unused. diff --git a/repository/OpenPonk-Spec/OPWorkbench.class.st b/repository/OpenPonk-Spec/OPWorkbench.class.st index d162cb57..fae14d0c 100644 --- a/repository/OpenPonk-Spec/OPWorkbench.class.st +++ b/repository/OpenPonk-Spec/OPWorkbench.class.st @@ -126,19 +126,22 @@ OPWorkbench >> closeEditorOfDiagram: aDiagram [ { #category : 'opening' } OPWorkbench >> closedTabOfEditor: anEditor [ - self projectController updateDiagram: - anEditor diagramController diagramElement. - anEditor tabDeleted. - topToolbar activeEditor: nil. - editors removeKey: anEditor diagramController diagramElement. - anEditor diagramController diagramElement isSelected: false. - focusedEditor = anEditor ifTrue: [ + self closedTabOfEditor: anEditor whileClosingWorkbench: false +] + +{ #category : 'opening' } +OPWorkbench >> closedTabOfEditor: anEditor whileClosingWorkbench: discardChanges [ + + focusedEditor = anEditor ifTrue: [ focusedEditor := nil. self announce: (OPEditorUnfocused on: anEditor) ]. + anEditor tabClosedWhileClosingWorkbench: discardChanges. + topToolbar activeEditor: nil. + editors removeKey: anEditor diagramController diagramElement. self announce: (OPEditorClosed on: anEditor) ] -{ #category : 'as yet unclassified' } +{ #category : 'initialization' } OPWorkbench >> connectPresenters [ super connectPresenters. @@ -197,7 +200,7 @@ OPWorkbench >> initialize [ super initialize ] -{ #category : 'as yet unclassified' } +{ #category : 'initialization' } OPWorkbench >> initializePresenters [ topToolbar := self instantiate: OPWorkbenchToolbar. @@ -211,7 +214,7 @@ OPWorkbench >> initializePresenters [ add: notebook ] -{ #category : 'as yet unclassified' } +{ #category : 'initialization' } OPWorkbench >> initializeWindow: aWindow [ aWindow @@ -220,7 +223,9 @@ OPWorkbench >> initializeWindow: aWindow [ initialExtent: self class initialExtent; whenClosedDo: [ editors valuesDo: [ :each | - self closedTabOfEditor: (each at: #editor) ] ] + self + closedTabOfEditor: (each at: #editor) + whileClosingWorkbench: true ] ] ] { #category : 'accessing - spec' } @@ -284,7 +289,7 @@ OPWorkbench >> openProject: aProject [ self updateTitle. ] -{ #category : 'as yet unclassified' } +{ #category : 'opening' } OPWorkbench >> pageRemoved: aPage [ "activePresenter is editor" @@ -307,7 +312,7 @@ OPWorkbench >> projectTree [ ^ projectTree ] -{ #category : 'as yet unclassified' } +{ #category : 'opening' } OPWorkbench >> showAllElementsInAllDiagrams [ self projectController controllers do: [ :each |