From 089832880807e21e696b5f321a81fa93473c07a9 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Mon, 29 Aug 2016 12:17:11 +0300 Subject: [PATCH] Several Wiki documentation view improvements. * Pin Selection toggle button added to Documentation view toolbar * Added support for linking to internal documents within the Simantics database in wiki documentation: [[Media:root://Documents/Document.pdf|This is the anchor text for the created link]] ** DocumentDialect will transform links like this into external links that look like this: [http://simantics-internal/http://Projects/Development%20Project/Project/Documents/Document.pdf This is the anchor text for the created link] ** Obviously external browsers and viewers do not understand these links but when these links are clicked in the Workbench Documentation view, the Browser component location changes are intercepted by the function returned by org.simantics.document.ui.function.All.locationChanging and the workbench's default action is performed for the database resource/variable that the URI in the link resolves to in the Simantics database. * DiagramViewerSelectionProvider.SelectionElement will now return a the variable of the diagram composite when element selection is the diagram resource itself. This helps the Documentation view show the wiki page of the diagram composite when nothing is selected on the diagram editor. * Fixed a couple of typos from org.simantics.scl.reflection.internal.registry.Namespace * org.simantics.views.ontology now supports defining SWT RowLayout/RowData for modelled composites. This is used in the Documentation view to flow all the action buttons above the text editor to separate rows even when the view is not wide enough to fit all buttons on a single row. refs #6449 --- .../graph.tg | Bin 16904 -> 16620 bytes .../graph/DocumentUI.pgraph | 99 +++++--------- .../document/ui/DocumentUIResource.java | 6 + .../simantics/document/ui/DocumentView.java | 35 +++++ .../simantics/document/ui/function/All.java | 79 ++++++++++- .../simantics/document/DocumentDialect.java | 126 +++++++++++------- .../org/simantics/document/function/All.java | 1 - .../internal/registry/Namespace.java | 6 +- bundles/org.simantics.views.ontology/graph.tg | Bin 33653 -> 37985 bytes .../graph/Views.pgraph | 39 ++++++ .../views/ontology/ViewsResources.java | 87 ++++++++++++ .../views/swt/client/base/SWTViewUtils.java | 49 ++++++- .../swt/client/base/SingleSWTViewNode.java | 8 +- .../views/swt/client/impl/SWTBrowser.java | 22 ++- .../views/swt/client/impl/SWTComposite.java | 6 +- .../views/swt/client/impl/SWTExplorer.java | 6 +- .../views/swt/client/impl/SWTSashForm.java | 6 +- .../swt/client/impl/SWTScrolledComposite.java | 6 +- .../views/swt/client/impl/SWTTabFolder.java | 6 +- .../src/org/simantics/views/All.java | 14 +- .../src/org/simantics/views/ViewUtils.java | 83 ++++++++++-- 21 files changed, 530 insertions(+), 154 deletions(-) diff --git a/bundles/org.simantics.document.ui.ontology/graph.tg b/bundles/org.simantics.document.ui.ontology/graph.tg index 0501da80502987c0dafd4f487d754a5686c2a3cf..a32cf12e7b099dd425525150c5fb82651e506854 100644 GIT binary patch literal 16620 zcmbtb33wgVb)IW&PqHLiwrpe8$7Ud4;}zS04YIt+c$bkeOU%>LSbF&BjhOdjVZy$L zec$(eC!tAb5=u$hkY)qYgeD~+5FiOl+BAfaLKEo!pF3yfzA^dwwe|O1&HU&5XSw^G z=b5_xFgG;dd7eS>8u%yrSJx8y`<=mXsWOVW5A zmnwxy!7pcsT~DJj>d89k^S2aApa!MUq(=X0Yu5)srOK|hlpFLVMr~#LkiE++K?-3h zSFB>z59LC{7ypS>X3Y?zSZ-aWtCU#QHI*y5ia!V=o3NPHZ_5>j|K}Ri2~FyahI=Ba zz5Hcp{umb56eCT8-$wa?p)c!HiqPANX!NdsUZvxjw!&4C_6ea z^Tvo-Q&$PyRm%How!rOp>&mI=RFS}};`jR@TwErC`n9>RLKD+1cr+4SoU7zEU@*Z? zv-Q(e8t}tH1zCH0S;?AGB`5~{tnZ`NuzPsO4><s-p8 zb%;l#iIK;fDL=v?zCyu*wknTNeIBIh6^Hw>aL1r&s_SDOqT*$T`341bqdSVSBvlIA zI3VAo@QucNQ0kNA5qaNF(VLFpp<>t|t3bekbPNTD)|J^SfENOqV-f??Ci>bfXbott zqq;3odxwd-sVJRi+uGbl*ho%vH;XIt`A1yDIp8($_9v{;k-_q)h`;ZRAd>KUR;+M4EhRN3bKSt+GJ1Lr9Z$}v7-bmc(csNjO zT7#0bYv(|&)GrIrm5`eQ6QcK#5E~YS!AMzB`y)UeW5x>wsz`e)ZL&5tFV-E^UYjxFx-;gwJ#rid&<=vMgjClvX7UVL5Q*s_>E~n>|oD0O~McyU@7b8*>{@gYVtg}cyi#$ zHVUyfC}OGehTUk`s5myfQ$-l9tKOM{baHxI1=^;CXo|Jwhr}|ddNU>nWf>uUYxOzQ7xUDws`sC_8yIn8C2Cy((c`m z>*Wl0j**9uFoUb{+OUAOtMKr12Ze_?Lvp6D8o=7%%K`E(3T8Tt*)fCB;p0vUW;=`) z3TpT0=tVE&@)bQe?wHb85?fL!JwoAF$K7reV3y?lk}uCP(O_Ld`EIqVgFg2DQlcf9 z{6L}DhX(~%Tu;eT$5B%a1g2G|ReUD@kn$#H(HSj*U6hzgJUVjC5>ks@s@T@DDtj+k zXCjbMG+hMk8w*>pSlV^h>6JOuPOr61={-XTBirUt^Uq8_LAtAom#A`W}f+k1+x-rB*{>w;5@^CgjTyQByw|*b-4`#Gqux9 z7EN0|SLzIXJQiw($m1eWHFG&iTzM~uw7o1(aeklj`Md#}t3^A8Yos5}bj*GwiqQjj z42d@x?@1B1$hj%unh7FqEd@&5V298RuJc)mfwx^0%{=Hi(z`_3ZdVDvj}Ly1c9XT? zI_F4zkxr;uCKI*EiW=Qn-B@vVo+SFVc->1(y)#7BB4-#!e6EPw3z#N+v|m}>*uNER zvoFI{A5XkTtSea;9aj|*w-#iXcI20dJnEAfj^ch%jI#@Fs(Eg8jb&^=&~-tK;zjS%WNw%}CV8fbF-7 zzgb0T!?;hI?q)S~W)&YyyP|XDrIf5r7DltiQf%{g@#udEC2JhYTA?&z{w&Xx`s5&X zF-2<~4o|#@G?Z*F-0#ggha!i^h6$Q}YVkCD^fB`@x`_esG11I#SIOEikjHc`2v8hB z?ZPqZ{ga0ap|48FuAsts#xvX=%=|X>BhToO6M2ehaDKP&4oNbTP>bW}{d8VmD zeu9a1qCG{{!h=75LEr;7PCI5a#e3GQU$zLKnF)+WQ|J#E<3(G$6q6Y=ImDV4?gK*s zW=Yhsvf0+8HyP7GXR{}wPkRdG;argqSk7K==7_!>`cCeLDXkpWYsP=N>0+98a!=;Q z8trx5YE36k1yP%ILEzQ2!LdBo$;gUSE6D9~#~V+BW`#2f=0?_^lG{9T=e8jdR$82# zoFw=hYv%H&D5;dAIb1YJdfqM)02?MZwaoWncNX#;^9lap{y2-x2^M=VMfiAJ&qu)t z)|{E*16T2hmA@bE&q(osm2Y;k`k3DWe0qux9P`_)KIYTcX(>K%%x|^&m``7yOYwnY z{%%$u^LGV4HN^*3zBk9}mGAv0Fn^kI+mnY$ZO;#_UitKGPD$~BWB%J#uYB(}z&Kb| z`R74X{l8`P%BOF$EyV|p`LA2O^1WXI52yIRG5;B>kNL}hIY-_40>}InRoYgDe`xY>N)`<9Cx5Z`?t`|W5ofQ6V3V$z!Io?lB{Kf`upfbnyI z#uq++KG635lGQ7pzDG2afq?TYb!@Eq2!`K5)$E+CzLi%K0et z#fNA&A08sKe>r!Fl~3DziVqy~F&C(h`LxAP!BzhG)3Ewye-f*I+U8Px;F!<$AXYwY zPfYQFV?O;6E1$NTQ+(i<|5>Y#`Luh^Xco@gfHs>aJ(KIjr)y`ej;#B zg3bB}zliH&mP@^%-9_LXjO%iT-(|5`f$QZcN1-fp^qm%)CDHx~Tk6f?2p@|3MJYaT z%wKBtRs16pzQ_C*B-kvp*c^fD6)51ELr@Nn;(;spFeg6rar@4V^z$73EJr^ZdSKHL z>6xpGSvTT2k)E-6CeZ#r%VLe^u|06!i!t+?o?vq}Fxp)8f~O_eV||G`aJ|Xe3TFMe z7O}skI()X*LBQI-&A6T!{i(!3W@a70PEU*8IHr5oW(# zkHWgsAIHIsD5$I14@KMKOp9ZCw#O7FU$)1-36}crlfru^SlWYF+XJ?SSla`(W-o`& z_Sh3x^FwUG+8(SA_1YfrCHP%j?}hxg5!U*$Zdu6Hp6$7ZgBfr46y6Q^7|5@&wuZO| z_t&DpRP;iAH=rPv=(RnV+oZ&wp+B@i?4Rv10a)WJR{!L;Cwwy|!q4OSxV5F; zw4rb>MJzMU;nRL>f~CH#2^N3E>JMB49Q%VW(}JSydz!^@{%qeS#~<4_`}yTxvMdVhp0s*gDb_kT#R z$F=Oe6#l(~e~$bAKzS9h9>A5h#M(X!BK!*U58|G_sDBywAzbO}cPJX4?f35~{BH@C z_9NEzqb;$vA8oNl#Qnv!hgkE$_}l@%?da#@o;Yf685_XyeB;=oUguj2?%zWB0GzvV z{ZoXsznB~K??ZnNu54>!XFU_F`MneABme9>(Racg>$$YuZ*Z^uIRY7QT)*YG|FwfL ze!X9zMB`U<#2Sz7@w$Vtz6g%iAF-ug^I@!CI`Owz9Q$MZ*HF~|RNVg}g@5K?j-P); z(ed+Igw>wohk6}9^hK=WhrWJ_67gmJ{Un9|CBZU&h;{tXmRQFRZC^ss_GT<%&1Zgu zwSQ?#y|xe9#``gfo6nC@_@5Ij`4DS9^z}m&jXx3hFQ90DQb(+M_UCixpJPxi zLv}A{zUB0989LzDp8fle4rc%SLxQFKznQ|{NU*FYe-Etnr7f}6 zm$t-OpM?>A7CD`Zd-{3?Mf-=j5G$YkL#*|qFJkQ<*5&U|lz#&5pLQ_Y@9Pd`dw(s3 zzY5Iuy#`m>688XKiz{u3)&IH(KLP!DxTi1bH9zL^wBFaqi6j4 z9nARmIhgV9MbY>VL|Eg~mU@j(TVgjpvBqcYdmKIE-{oM&zth2te+P=jzdOPjpSIL% z{5vD;#;0E6GxqH$s%QLL9nAQ*IGFKoM$!1UMOfq0mU@j(TVnOk_9xc(jD3@%XZ#x+ z%=p(knDMVe(fBt;SmV={dW}z8VmCgq#%Jtn9X;c7Tq&RNuW~TsUx}jeuZgh6r!Dmw zpSHy6kM$?k_>6spqi6if9L)HaI+*b6rPis~8v3v%sX8e+a8GjH(;}1nxL-T1^BpRxNLJ>&ZhX8b+}GkzXL<8O(u#-}ay8lSerZhT^m z&)B_=p7Bp~Fyn7_Fyns~MdRlptnp8bu*Rn?`EGn-jnCM}J9@_7jE(i35hIqu8!MLoutxfJ))ERO3(-_UD5 zhT~%jxKaDbZ_h5yru36jctQ%-R%7`s#qlS<7r6L^6#wZIekz5ZOyNgT`2G}TAGq;u zP2n3-`05nqm~!neO5t-;_>2_Zp2D1OuD>9KPfB5~$1eZG6yB7=9B<%j|9bo3eqRT3 zeC>+Tj6Q!9*IiI{PT@(wI$n3eJ@I7w|0mu!+_TSBPk)r@{GpCm^_*XA4(51oMH!3u z>^tg+l|LHyESg^n?wcI_UJ>30_V?kQb%Q=0zpTHDIo4ggXEm1JP944ccIV=^QvBCb z_@xx)THxBJ;!EGSdiI5j*%vNm+q;-;>teQ@i`jN2X%FgT|KK_-8u>NGa?pm6>>H!x z)^^9&>j~QJ+n?oZWx&t&CGS6eO|)aI)>V8(6!SWUhKl&CFq`N*UpNg7EX*dKtzDINHnWs==3ScR%qUk< z0lj&`spZ?d$oJ1Ec3@m6@@!nYQWmeU${U{95xhemIBmb3Q7UVJZ- zf_r@hX~@*O(rV&~VqbUpYI^$xWV z;SP1!r9m3S{;8=6{XUuFb^W35m*lp#7az&$8u|%{Q87D9UdgwoW>S@}`YpM^LUFs0 z>IdZGBI{ZfHxbu$;A^QOTxRN5;~OU4nu*q+TfZY+Eva$YANPND-&(r}Edm!~#rgQv zLDJ?}s>=hx2$W4#{{L4^k%^PEK9H_=q{`&~^xz-(FR^T{wkXAa6nmBMx)f!1l!GPV zJ&zALI|}&RPd`4+hS`Wv0E%QUhMy za-d|eH$EA6J|Nc-J8ify4c{u+7m#82I}}^f1H`P23vpI9uPnDXt}NcZqB`iWd(?N- zkM7cq16IElt7No!uW81t?=KXvzCZi_)OUi!iQkjY+IQdK^`|JdZa<0d+B7VC@yD_F RNAcYc#ar@K^f#^MzX1XUL*M`a literal 16904 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 Boolean" UI.WikitextContribution.View UI.NoDocument : VIEWS.Composite diff --git a/bundles/org.simantics.document.ui.ontology/src/org/simantics/document/ui/DocumentUIResource.java b/bundles/org.simantics.document.ui.ontology/src/org/simantics/document/ui/DocumentUIResource.java index 7c5b0f455..82375ae2a 100644 --- a/bundles/org.simantics.document.ui.ontology/src/org/simantics/document/ui/DocumentUIResource.java +++ b/bundles/org.simantics.document.ui.ontology/src/org/simantics/document/ui/DocumentUIResource.java @@ -34,9 +34,11 @@ public class DocumentUIResource { public final Resource Functions_horizontalRulerModifier; public final Resource Functions_imageModifier; public final Resource Functions_indentModifier; + public final Resource Functions_internalLinkModifier; public final Resource Functions_isWikitext; public final Resource Functions_italicModifier; public final Resource Functions_linkModifier; + public final Resource Functions_locationChanging; public final Resource Functions_noDocumentText; public final Resource Functions_numberedListModifier; public final Resource Functions_onCreateDocumentButton; @@ -83,9 +85,11 @@ public class DocumentUIResource { public static final String Functions_horizontalRulerModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/horizontalRulerModifier"; public static final String Functions_imageModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/imageModifier"; public static final String Functions_indentModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/indentModifier"; + public static final String Functions_internalLinkModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/internalLinkModifier"; public static final String Functions_isWikitext = "http://www.simantics.org/DocumentUI-1.1/Functions/isWikitext"; public static final String Functions_italicModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/italicModifier"; public static final String Functions_linkModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/linkModifier"; + public static final String Functions_locationChanging = "http://www.simantics.org/DocumentUI-1.1/Functions/locationChanging"; public static final String Functions_noDocumentText = "http://www.simantics.org/DocumentUI-1.1/Functions/noDocumentText"; public static final String Functions_numberedListModifier = "http://www.simantics.org/DocumentUI-1.1/Functions/numberedListModifier"; public static final String Functions_onCreateDocumentButton = "http://www.simantics.org/DocumentUI-1.1/Functions/onCreateDocumentButton"; @@ -142,9 +146,11 @@ public class DocumentUIResource { Functions_horizontalRulerModifier = getResourceOrNull(graph, URIs.Functions_horizontalRulerModifier); Functions_imageModifier = getResourceOrNull(graph, URIs.Functions_imageModifier); Functions_indentModifier = getResourceOrNull(graph, URIs.Functions_indentModifier); + Functions_internalLinkModifier = getResourceOrNull(graph, URIs.Functions_internalLinkModifier); Functions_isWikitext = getResourceOrNull(graph, URIs.Functions_isWikitext); Functions_italicModifier = getResourceOrNull(graph, URIs.Functions_italicModifier); Functions_linkModifier = getResourceOrNull(graph, URIs.Functions_linkModifier); + Functions_locationChanging = getResourceOrNull(graph, URIs.Functions_locationChanging); Functions_noDocumentText = getResourceOrNull(graph, URIs.Functions_noDocumentText); Functions_numberedListModifier = getResourceOrNull(graph, URIs.Functions_numberedListModifier); Functions_onCreateDocumentButton = getResourceOrNull(graph, URIs.Functions_onCreateDocumentButton); diff --git a/bundles/org.simantics.document.ui/src/org/simantics/document/ui/DocumentView.java b/bundles/org.simantics.document.ui/src/org/simantics/document/ui/DocumentView.java index ccbfbd508..025b88b08 100644 --- a/bundles/org.simantics.document.ui/src/org/simantics/document/ui/DocumentView.java +++ b/bundles/org.simantics.document.ui/src/org/simantics/document/ui/DocumentView.java @@ -11,7 +11,12 @@ *******************************************************************************/ package org.simantics.document.ui; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IWorkbenchPart; import org.simantics.ui.workbench.IPropertyPage; +import org.simantics.utils.ui.BundleUtils; import org.simantics.views.swt.ModelledView; /** @@ -19,6 +24,8 @@ import org.simantics.views.swt.ModelledView; */ public class DocumentView extends ModelledView { + private boolean pinSelection = false; + @Override protected String configurationURI() { return DocumentUIResource.URIs.View; @@ -29,4 +36,32 @@ public class DocumentView extends ModelledView { return null; } + @Override + protected void inputChanged(IWorkbenchPart provider, Object input) { + if (pinSelection) + return; + super.inputChanged(provider, input); + } + + @Override + public void createPartControl(Composite parent) { + super.createPartControl(parent); + getViewSite().getActionBars().getToolBarManager().add(new PinSelection()); + } + + private class PinSelection extends Action { + public PinSelection() { + super("Pin Selection", IAction.AS_CHECK_BOX); + setImageDescriptor( + BundleUtils.getImageDescriptorFromPlugin( + "org.eclipse.ui", + "icons/full/etool16/pin_editor.png")); + } + + @Override + public void run() { + pinSelection = isChecked(); + } + } + } diff --git a/bundles/org.simantics.document.ui/src/org/simantics/document/ui/function/All.java b/bundles/org.simantics.document.ui/src/org/simantics/document/ui/function/All.java index 20b8d3d0e..e5f8b4392 100644 --- a/bundles/org.simantics.document.ui/src/org/simantics/document/ui/function/All.java +++ b/bundles/org.simantics.document.ui/src/org/simantics/document/ui/function/All.java @@ -13,8 +13,11 @@ package org.simantics.document.ui.function; import java.util.TreeMap; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.browser.LocationEvent; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; @@ -30,19 +33,26 @@ import org.simantics.browsing.ui.NodeContext; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.Session; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.ReadRequest; +import org.simantics.db.common.request.UnaryRead; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.utils.Logger; import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.common.utils.RequestUtil; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.adapter.Instances; import org.simantics.db.layer0.request.PossibleModel; +import org.simantics.db.layer0.request.PossibleResource; import org.simantics.db.layer0.util.RemoverUtil; import org.simantics.db.layer0.variable.RVI; import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.document.DocumentDialect; import org.simantics.document.DocumentResource; import org.simantics.document.DocumentUtils; +import org.simantics.document.ui.Activator; import org.simantics.document.ui.CSSEditor; import org.simantics.layer0.Layer0; import org.simantics.scenegraph.INode; @@ -50,9 +60,12 @@ import org.simantics.scenegraph.loader.ScenegraphLoaderProcess; import org.simantics.scenegraph.loader.ScenegraphLoaderUtils; import org.simantics.scenegraph.loader.ScenegraphLoaderUtils.ScenegraphPropertyReference; import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.scl.runtime.function.Function1; import org.simantics.scl.runtime.function.FunctionImpl1; import org.simantics.scl.runtime.function.FunctionImpl3; +import org.simantics.ui.SimanticsUI; import org.simantics.ui.workbench.ResourceEditorInput2; +import org.simantics.ui.workbench.action.DefaultActions; import org.simantics.utils.threads.SWTThread; import org.simantics.utils.ui.workbench.WorkbenchUtils; @@ -546,7 +559,7 @@ public class All { @Override void perform(String before, String selected, String after, Point selection) { - textReference.setValue(before + "[[Image:root://Library/image.png|100px]]" + selected + after); + textReference.setValue(before + "[[Image:root://Library/image.png|100px]]" + "\r\n" + selected + after); } @@ -683,6 +696,18 @@ public class All { } + @SCLValue(type = "ReadGraph -> Resource -> Variable -> b") + public static Object internalLinkModifier(ReadGraph graph, Resource resource, final Variable context) throws DatabaseException { + return new WikiButtonModifier(graph, context) { + @Override + void perform(String before, String selected, String after, Point selection) { + textReference.setValue(before + + "[[Media:root://Documents/Document.pdf|Link to a file within the model]]\r\n" + selected + after); + + } + }; + } + @SCLValue(type = "ReadGraph -> Resource -> Variable -> b") public static Object linkModifier(ReadGraph graph, Resource resource, final Variable context) throws DatabaseException { @@ -691,8 +716,8 @@ public class All { @Override void perform(String before, String selected, String after, Point selection) { - textReference.setValue(before + "\r\n" + - "[http://www.simantics.org External Website Link]\r\n" + selected + after); + textReference.setValue(before + + "[http://www.simantics.org External Website Link]\r\n" + selected + after); } @@ -815,5 +840,51 @@ public class All { return true; } - + + private static class ResolveURI extends UnaryRead { + public ResolveURI(String uri) { + super(uri); + } + @Override + public Object perform(ReadGraph graph) throws DatabaseException { + Object result = graph.syncRequest(new PossibleResource(parameter)); + if (result == null) + result = Variables.getPossibleVariable(graph, parameter); + return result; + } + } + + private static final Function1 PERFORM_DEFAULT_ACTION_FOR_URI_RESOURCE = new Function1() { + @Override + public Boolean apply(Object p0) { + LocationEvent le = (LocationEvent) p0; + if (le.location.startsWith(DocumentDialect.SIMANTICS_INTERNAL_URI_PREFIX)) { + // This is not a valid URL anyway so deny relocation. + le.doit = false; + + // Try to execute default action for the resource or variable + // that the URI represents. + String uri = le.location.substring(DocumentDialect.SIMANTICS_INTERNAL_URI_PREFIX.length()); + try { + Session s = Simantics.getSession(); + Object input = RequestUtil.trySyncRequest(s, + SimanticsUI.UI_THREAD_REQUEST_START_TIMEOUT, + SimanticsUI.UI_THREAD_REQUEST_EXECUTION_TIMEOUT, + new ResolveURI(uri)); + if (input != null) { + DefaultActions.asyncPerformDefaultAction(s, input, false, false, false); + } + } catch (DatabaseException | InterruptedException e) { + Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to resolve URI to a database resource or variable: " + uri, e)); + } + } + return true; + } + }; + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> b") + public static Function1 locationChanging(ReadGraph graph, Resource variable, Variable context) throws DatabaseException { + return PERFORM_DEFAULT_ACTION_FOR_URI_RESOURCE; + } + } diff --git a/bundles/org.simantics.document/src/org/simantics/document/DocumentDialect.java b/bundles/org.simantics.document/src/org/simantics/document/DocumentDialect.java index 9fc8e98a7..7cb6bbee0 100644 --- a/bundles/org.simantics.document/src/org/simantics/document/DocumentDialect.java +++ b/bundles/org.simantics.document/src/org/simantics/document/DocumentDialect.java @@ -11,9 +11,10 @@ *******************************************************************************/ package org.simantics.document; -import java.io.File; import java.io.IOException; import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Path; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.regex.Matcher; @@ -26,78 +27,109 @@ import org.simantics.db.Resource; import org.simantics.db.common.request.PossibleIndexRoot; import org.simantics.db.exception.DatabaseException; import org.simantics.image2.ontology.ImageResource; -import org.simantics.utils.FileUtils; - public class DocumentDialect { - - final Pattern imagePattern = Pattern.compile("\\[\\[Image(?::([^\\]]+))?\\]\\]"); final static public DocumentDialect INSTANCE = new DocumentDialect(); - public String transform(ReadGraph graph, Resource res, String options) { - + public static final String SIMANTICS_INTERNAL_URI_PREFIX = "http://simantics-internal/"; + + private static final String HTTP = "http://"; + private static final String ROOT = "root:/"; + private static final String IMAGE = "image"; + private static final String MEDIA = "media"; + + final Pattern imageOrMediaPattern = Pattern.compile("\\[\\[([Ii]mage|[Mm]edia)(?::([^\\]]+))?\\]\\]"); + + private static String digest(byte[] bytes) throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(bytes); + BigInteger number = new BigInteger(1, md.digest()); + return number.toString(16); + } + + private static String imageExtension(ReadGraph graph, Resource image) throws DatabaseException { + ImageResource IMAGE = ImageResource.getInstance(graph); + if (graph.isInstanceOf(image, IMAGE.PngImage)) + return ".png"; + else if (graph.isInstanceOf(image, IMAGE.JpegImage)) + return ".jpg"; + return null; + } + + public String transform(ReadGraph graph, Resource res, String type, String options) { try { - String[] parts = options.split("\\|"); - if(parts.length > 0) { - + if (parts.length > 0) { String uri = parts[0]; + Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(res)); - if(indexRoot == null) return null; + if (indexRoot == null) return null; String rootURI = graph.getURI(indexRoot); - uri = uri.replace("root:/", rootURI); - // (Apros #12268) For easier image linking, allow users to - // write white space as ' ' in the wiki-style image links. + + uri = uri.replace(ROOT, rootURI); + + // (Apros #12268) For more user-friendly linking, allow users to + // write white space as ' ' in the wiki-style image links instead + // of having to write %20. uri = uri.replace(" ", "%20"); - Resource image = graph.getPossibleResource(uri); - if(image == null) return null; - byte[] bytes = graph.getValue(image, Bindings.BYTE_ARRAY); - MessageDigest md; - md = MessageDigest.getInstance("MD5"); - md.update(bytes); - BigInteger number = new BigInteger(1, md.digest()); - String digest = number.toString(16); - File dir = Simantics.getTemporaryDirectory("documentImages"); - dir.mkdirs(); - - ImageResource IMAGE = ImageResource.getInstance(graph); - - String extension; - if(graph.isInstanceOf(image, IMAGE.PngImage)) extension = ".png"; - else if(graph.isInstanceOf(image, IMAGE.JpegImage)) extension = ".jpg"; - else return null; - - File f = new File(dir, digest + extension); - if(!f.exists()) - FileUtils.writeFile(f, bytes); - StringBuilder sb = new StringBuilder(); - sb.append("[[File: " + f.toURI()); - for(int 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 literal 33653 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 J-K(w={sSGYq^bY_ diff --git a/bundles/org.simantics.views.ontology/graph/Views.pgraph b/bundles/org.simantics.views.ontology/graph/Views.pgraph index c91515096..65f9a4cbb 100644 --- a/bundles/org.simantics.views.ontology/graph/Views.pgraph +++ b/bundles/org.simantics.views.ontology/graph/Views.pgraph @@ -86,6 +86,8 @@ Views.Control.Style.Constant.Check = 32 : L0.Integer Views.Control.Style.Constant.Wrap = 64 : L0.Integer Views.Control.Style.Constant.HScroll = 256 : L0.Integer Views.Control.Style.Constant.VScroll = 512 : L0.Integer +Views.Control.Style.Constant.Horizontal = 256 : L0.Integer +Views.Control.Style.Constant.Vertical = 512 : L0.Integer Views.Control.Style.Constant.Border = 2048 : L0.Integer Views.Control.Style.Constant.FullSelection = 65536 : L0.Integer Views.Control.Style.Constant.NoFocus = 524288 : L0.Integer @@ -220,6 +222,7 @@ Views.Button -- Views.Browser.document ==> "String" -- Views.Browser.variable ==> "Variable" -- Views.Browser.locationChanging ==> "a -> Boolean" -- Views.WikiBrowser.document ==> "String" -- Views.RowLayout.type ==> "Integer" -- Views.RowLayout.spacing ==> "Integer" -- Views.RowLayout.center ==> "Boolean" -- Views.RowLayout.fill ==> "Boolean" -- Views.RowLayout.justify ==> "Boolean" -- Views.RowLayout.pack ==> "Boolean" -- Views.RowLayout.wrap ==> "Boolean" -- Views.RowLayout.extendedMargins ==> "a" -- Views.RowLayout.RowData.width ==> "Integer" -- Views.RowLayout.RowData.height ==> "Integer" extends SWTParentNode implements LoaderNode { @@ -36,7 +36,7 @@ abstract public class SingleSWTViewNode extends SWTParentNode private Map genericProperties = new HashMap(); public Function2 propertyCallback; - public GridDataBean layoutData; + public LayoutDataBean layoutData; public int style; public String text; public RGB.Integer background; @@ -292,8 +292,8 @@ abstract public class SingleSWTViewNode extends SWTParentNode final public void synchronizeStyle(int style) { } - final public void synchronizeLayoutData(GridDataBean layoutData) { - if(layoutData != null) control.setLayoutData(SWTViewUtils.toGridData(layoutData)); + final public void synchronizeLayoutData(LayoutDataBean layoutData) { + if(layoutData != null) control.setLayoutData(SWTViewUtils.toLayoutData(layoutData)); } } diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTBrowser.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTBrowser.java index 6df6bdaad..5c4d21269 100644 --- a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTBrowser.java +++ b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTBrowser.java @@ -3,8 +3,11 @@ package org.simantics.views.swt.client.impl; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.browser.LocationEvent; +import org.eclipse.swt.browser.LocationListener; import org.eclipse.swt.widgets.Composite; import org.simantics.db.layer0.variable.Variable; +import org.simantics.scl.runtime.function.Function1; import org.simantics.utils.datastructures.map.Tuple; import org.simantics.views.swt.client.base.SingleSWTViewNode; @@ -12,10 +15,11 @@ public class SWTBrowser extends SingleSWTViewNode { private static final long serialVersionUID = -2704760050046054447L; - public String document; - public Variable variable; + public String document; + public Variable variable; + public Function1 locationChanging; - private Tuple lastAppliedParametrization; + private Tuple lastAppliedParametrization; @Override public void reset() { @@ -32,6 +36,18 @@ public class SWTBrowser extends SingleSWTViewNode { control = new Browser(parent, style); GridDataFactory.fillDefaults().grab(true, true).applyTo(control); + control.addLocationListener(new LocationListener() { + @Override + public void changing(LocationEvent event) { + Function1 lc = locationChanging; + if (lc != null) + lc.apply(event); + } + @Override + public void changed(LocationEvent event) { + } + }); + setProperties(); } diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTComposite.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTComposite.java index 5fe825a96..a67d0abf9 100644 --- a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTComposite.java +++ b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTComposite.java @@ -1,7 +1,7 @@ package org.simantics.views.swt.client.impl; import org.eclipse.swt.widgets.Composite; -import org.simantics.views.ViewUtils.GridLayoutBean; +import org.simantics.views.ViewUtils.LayoutBean; import org.simantics.views.swt.client.base.SWTViewUtils; import org.simantics.views.swt.client.base.SingleSWTViewNode; @@ -9,7 +9,7 @@ public class SWTComposite extends SingleSWTViewNode { private static final long serialVersionUID = 7932335224632082902L; - public GridLayoutBean layout; + public LayoutBean layout; @Override public void createControls(org.eclipse.swt.widgets.Composite parent) { @@ -22,7 +22,7 @@ public class SWTComposite extends SingleSWTViewNode { } - final public void synchronizeLayout(GridLayoutBean layout) { + final public void synchronizeLayout(LayoutBean layout) { if(layout != null) control.setLayout(SWTViewUtils.toLayout(layout)); } diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTExplorer.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTExplorer.java index f448ebde4..3c0ce5a1f 100644 --- a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTExplorer.java +++ b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTExplorer.java @@ -23,7 +23,7 @@ import org.simantics.browsing.ui.swt.widgets.ModelBrowser; import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl; import org.simantics.scl.runtime.function.Function1; import org.simantics.views.ViewUtils.ColumnBean; -import org.simantics.views.ViewUtils.GridLayoutBean; +import org.simantics.views.ViewUtils.LayoutBean; import org.simantics.views.swt.client.base.SWTViewUtils; import org.simantics.views.swt.client.base.SingleSWTViewNode; @@ -31,7 +31,7 @@ public class SWTExplorer extends SingleSWTViewNode { private static final long serialVersionUID = 7932335224632082902L; - public GridLayoutBean layout; + public LayoutBean layout; public String browseContext; public String contextMenuId; public String uiContext; @@ -189,7 +189,7 @@ public class SWTExplorer extends SingleSWTViewNode { } } - final public void synchronizeLayout(GridLayoutBean layout) { + final public void synchronizeLayout(LayoutBean layout) { } } diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTSashForm.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTSashForm.java index 5bc8b2366..af79bdc8d 100644 --- a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTSashForm.java +++ b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTSashForm.java @@ -3,7 +3,7 @@ package org.simantics.views.swt.client.impl; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Sash; -import org.simantics.views.ViewUtils.GridLayoutBean; +import org.simantics.views.ViewUtils.LayoutBean; import org.simantics.views.swt.client.base.SWTViewUtils; import org.simantics.views.swt.client.base.SingleSWTViewNode; @@ -11,7 +11,7 @@ public class SWTSashForm extends SingleSWTViewNode { private static final long serialVersionUID = 7932335224632082902L; - public GridLayoutBean layout; + public LayoutBean layout; public int[] weights; public Integer orientation; @@ -26,7 +26,7 @@ public class SWTSashForm extends SingleSWTViewNode { } - final public void synchronizeLayout(GridLayoutBean layout) { + final public void synchronizeLayout(LayoutBean layout) { if(layout != null) control.setLayout(SWTViewUtils.toLayout(layout)); } diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java index 421315f89..1bf86ca12 100644 --- a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java +++ b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTScrolledComposite.java @@ -13,7 +13,7 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; -import org.simantics.views.ViewUtils.GridLayoutBean; +import org.simantics.views.ViewUtils.LayoutBean; import org.simantics.views.swt.client.base.SWTViewUtils; import org.simantics.views.swt.client.base.SingleSWTViewNode; @@ -23,7 +23,7 @@ public class SWTScrolledComposite extends SingleSWTViewNode { private static final long serialVersionUID = 7932335224632082902L; - public GridLayoutBean layout; + public LayoutBean layout; private int minSize = 100; @@ -124,7 +124,7 @@ public class SWTScrolledComposite extends SingleSWTViewNode { } - final public void synchronizeLayout(GridLayoutBean layout) { + final public void synchronizeLayout(LayoutBean layout) { if(layout != null) control.setLayout(SWTViewUtils.toLayout(layout)); } diff --git a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTTabFolder.java b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTTabFolder.java index b8aebe537..629f28285 100644 --- a/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTTabFolder.java +++ b/bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTTabFolder.java @@ -14,7 +14,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.simantics.browsing.ui.swt.widgets.GraphExplorerComposite; import org.simantics.utils.ui.jface.BasePostSelectionProvider; -import org.simantics.views.ViewUtils.GridLayoutBean; +import org.simantics.views.ViewUtils.LayoutBean; import org.simantics.views.swt.client.base.ISWTViewNode; import org.simantics.views.swt.client.base.SingleSWTViewNode; @@ -24,7 +24,7 @@ public class SWTTabFolder extends SingleSWTViewNode { public List childNames; - public GridLayoutBean layout; + public LayoutBean layout; final BasePostSelectionProvider selectionProvider = new BasePostSelectionProvider(); @@ -119,7 +119,7 @@ public class SWTTabFolder extends SingleSWTViewNode { } - final public void synchronizeLayout(GridLayoutBean layout) { + final public void synchronizeLayout(LayoutBean layout) { } } diff --git a/bundles/org.simantics.views/src/org/simantics/views/All.java b/bundles/org.simantics.views/src/org/simantics/views/All.java index 941213f9c..6d26bb7f8 100644 --- a/bundles/org.simantics.views/src/org/simantics/views/All.java +++ b/bundles/org.simantics.views/src/org/simantics/views/All.java @@ -104,12 +104,22 @@ public class All { @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") public static Object gridData(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { - return ViewUtils.getGridData(graph, converter); + return ViewUtils.getGridData(graph, converter); } @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") public static Object gridLayout(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { - return ViewUtils.getLayout(graph, converter); + return ViewUtils.getLayout(graph, converter); + } + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") + public static Object rowData(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { + return ViewUtils.getRowData(graph, converter); + } + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") + public static Object rowLayout(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { + return ViewUtils.getRowLayout(graph, converter); } @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") diff --git a/bundles/org.simantics.views/src/org/simantics/views/ViewUtils.java b/bundles/org.simantics.views/src/org/simantics/views/ViewUtils.java index f22e5ad83..749c2856e 100644 --- a/bundles/org.simantics.views/src/org/simantics/views/ViewUtils.java +++ b/bundles/org.simantics.views/src/org/simantics/views/ViewUtils.java @@ -32,20 +32,35 @@ public class ViewUtils { } public static final Binding EXTENDED_MARGINS_BINDING = Bindings.getBindingUnchecked(ExtendedMargins.class); - - public static class GridLayoutBean extends Bean { - - public int numColumns; - public int horizontalSpacing; - public int verticalSpacing; + + public static class LayoutBean extends Bean { public int marginLeft; public int marginRight; public int marginTop; public int marginBottom; + } + + public static class GridLayoutBean extends LayoutBean { + + public int numColumns; + public int horizontalSpacing; + public int verticalSpacing; } - - public static class GridDataBean extends Bean { + + public static class RowLayoutBean extends LayoutBean { + public int type; + public int spacing; + public boolean center; + public boolean fill; + public boolean justify; + public boolean pack; + public boolean wrap; + } + + public static class LayoutDataBean extends Bean {} + + public static class GridDataBean extends LayoutDataBean { public int horizontalSpan; public boolean grabExcessHorizontalSpace; @@ -56,7 +71,12 @@ public class ViewUtils { public int heightHint; } - + + public static class RowDataBean extends LayoutDataBean { + public int width; + public int height; + } + public static class ColumnBean extends Bean { public String key; @@ -128,6 +148,50 @@ public class ViewUtils { } + public static RowLayoutBean getRowLayout(RequestProcessor processor, Resource configuration) throws DatabaseException { + return processor.sync(new ResourceRead(configuration) { + @Override + public RowLayoutBean perform(ReadGraph graph) throws DatabaseException { + ViewsResources VIEW = ViewsResources.getInstance(graph); + Integer type = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_type, Bindings.INTEGER); + Integer spacing = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_spacing, Bindings.INTEGER); + Boolean center = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_center, Bindings.BOOLEAN); + Boolean fill = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_fill, Bindings.BOOLEAN); + Boolean justify = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_justify, Bindings.BOOLEAN); + Boolean pack = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_pack, Bindings.BOOLEAN); + Boolean wrap = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_wrap, Bindings.BOOLEAN); + ExtendedMargins extendedMargins = graph.getPossibleRelatedValue(resource, VIEW.RowLayout_extendedMargins, EXTENDED_MARGINS_BINDING); + + RowLayoutBean layout = new RowLayoutBean(); + layout.type = type; + layout.spacing = spacing; + layout.center = center; + layout.fill = fill; + layout.justify = justify; + layout.pack = pack; + layout.wrap = wrap; + layout.marginLeft = extendedMargins.left; + layout.marginRight = extendedMargins.right; + layout.marginTop = extendedMargins.top; + layout.marginBottom = extendedMargins.bottom; + return layout; + } + }); + } + + public static RowDataBean getRowData(RequestProcessor processor, Resource configuration) throws DatabaseException { + return processor.sync(new ResourceRead(configuration) { + @Override + public RowDataBean perform(ReadGraph graph) throws DatabaseException { + ViewsResources VIEW = ViewsResources.getInstance(graph); + RowDataBean data = new RowDataBean(); + data.width = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_preferredWidth, Bindings.INTEGER); + data.height = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_preferredHeight, Bindings.INTEGER); + return data; + } + }); + } + public static int getStyle(RequestProcessor processor, Resource configuration) throws DatabaseException { return processor.sync(new ResourceRead(configuration) { @@ -188,6 +252,7 @@ public class ViewUtils { Simantics.getSession().async(new TernaryRead (configuration, context, relationURI) { + @SuppressWarnings("unchecked") @Override public T perform(ReadGraph graph) throws DatabaseException { Object value = graph.getRelatedValue2(parameter, graph.getResource(parameter3), parameter2); -- 2.43.2