From 001925771b6069cfe166469c84c78efd4cdccac0 Mon Sep 17 00:00:00 2001 From: Kai Michael Poppe Date: Sun, 10 May 2020 23:22:51 +0200 Subject: [PATCH] Initial checkin --- .gitignore | 5 + notesolver/MANIFEST | 15 + notesolver/README | 11 + notesolver/build.xml | 13 + .../notesolver/NoteSolverPlugin$1.class | Bin 0 -> 3919 bytes .../notesolver/NoteSolverPlugin$2.class | Bin 0 -> 1669 bytes .../notesolver/NoteSolverPlugin$3.class | Bin 0 -> 1666 bytes .../notesolver/NoteSolverPlugin$4.class | Bin 0 -> 2347 bytes .../notesolver/NoteSolverPlugin$5.class | Bin 0 -> 3410 bytes .../notesolver/NoteSolverPlugin$6.class | Bin 0 -> 5585 bytes .../notesolver/NoteSolverPlugin$7.class | Bin 0 -> 1129 bytes .../plugins/notesolver/NoteSolverPlugin.class | Bin 0 -> 8936 bytes notesolver/dist/notesolver.jar | Bin 0 -> 38411 bytes notesolver/src/.vscode/launch.json | 14 + notesolver/src/.vscode/settings.json | 6 + .../plugins/notesolver/NoteSolverPlugin.java | 323 ++++++++++++++++++ 16 files changed, 387 insertions(+) create mode 100644 .gitignore create mode 100644 notesolver/MANIFEST create mode 100644 notesolver/README create mode 100644 notesolver/build.xml create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$1.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$2.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$3.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$4.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$5.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$6.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$7.class create mode 100644 notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.class create mode 100644 notesolver/dist/notesolver.jar create mode 100644 notesolver/src/.vscode/launch.json create mode 100644 notesolver/src/.vscode/settings.json create mode 100644 notesolver/src/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3eed211 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ + +notesolver/_deploy.bat +notesolver/build/GPL-v2.0.txt +notesolver/build/GPL-v3.0.txt +notesolver/build/README diff --git a/notesolver/MANIFEST b/notesolver/MANIFEST new file mode 100644 index 0000000..f653287 --- /dev/null +++ b/notesolver/MANIFEST @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Ant-Version: Apache Ant 1.10.7 +Created-By: 1.8.0_251-b08 (Oracle Corporation) +Plugin-Mainversion: 10580 +Plugin-Version: UNKNOWN +Plugin-Class: org.openstreetmap.josm.plugins.notesolver.NoteSolverPlug + in +Plugin-Description: Used for closing notes when uploading a changeset + and referencing them in each other's comments to keep references. +Plugin-Date: 2020-05-10T23:07:54.659 +Author: Kai Michael Poppe +Plugin-Link: https://wiki.openstreetmap.org/wiki/User:Kmpoppe/Plugins# + noteSolver +Plugin-Canloadatruntime: true + diff --git a/notesolver/README b/notesolver/README new file mode 100644 index 0000000..d388c37 --- /dev/null +++ b/notesolver/README @@ -0,0 +1,11 @@ +README +====== + +Readme for your plugin + + * Plugin author and contact email address. + + * The license for your plugin source code. If you have no special preferences, + you can pick the license that is used for JOSM ("GPL v2 or later"). + + * Notes for future developers, if needed. diff --git a/notesolver/build.xml b/notesolver/build.xml new file mode 100644 index 0000000..5266a8a --- /dev/null +++ b/notesolver/build.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$1.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$1.class new file mode 100644 index 0000000000000000000000000000000000000000..ec6f5be12d340cbd276949e9083e87213691e73a GIT binary patch literal 3919 zcmbtX>r)%o75`mnrInW@U?n(J@B_Cv7GPMQ!Kr!J#sb$O0u$rl+D%(8(v4VK+EsQ} zV7uwNNz+IAe&M!h+PYC6na*S;CD6`f`lb2c{2~3=udSPep1WF!1y_zcFvH!u=bn2W zzk7b?u5Q2om$v{shSzrCFwzQ=nA(L&Jkf*5S(ECyY{07Y(PgpJ6m(*?G+>ano^a&fTJ3(ymxe zQ7aY7dBb!x({j0E6_&WI&Cqnto6dTRBV=dPFb(%O!-?ch40X*jNGU7F8Co)i$!E&N z1#X|$7YZbaXRNGVnAdGXy!%2)B*37iO_STHg6=q+UXSk}h|U4ZrzyM0vsa%g6)Zi+ z(9AFM-2&fqDy~l&oLz2A3#2e*%RU~;uU(&ULZsxT)*EY;N zt;<=fSmdT#*K}wawaV_iUSMEp21PF!eheSvIS?)7X>+%1n`Eank=c+Z`A=07zsdU&0-{dvTS*AR+sk0^5 zu*_NAk|-&R5ca9!7UlT6`{Y%5E|)FQNiy-^1oN{2mFy}+W@co zU~T8XmiW#tT;W+NtNsQS^{ha_(aIhtv??{uSeB?+FUzuP6tuL-xq8e|x5 z;P5_DU8GeldqlmmV;=Mdn)Aw3J^^`=*$XceW zQ)4DBCIdagR}coGgo?F98AkOI^>ylFy+KXCyZF%r8jjB&ay4SLzS1}t9m|fcu zW{vvwHs05;4MZ!jaII=G3|rBvH_+YAqP3i|%x4U{IAQ1oE6*_IgP||GTFNSxER#Cy z$lXu|B)+|LI#@A-{euiAca;4laa=Vt2L+ltyhh1fcLQ4G%Z4^hg)?3%6{racQWJsl z+|B6Mxjn6$dY%(~hp6oCVWA+DJv+f|bQS~u_avQr)#Br|u>dd6jKmD(G3_>qO8K#cR*;XUp8o@?dptk^fJF?G4R{ za%<6ZxgZvVV^H5O^+0~Uq-!1>^qrdoLl;xXukL+9_U>~OKbBgT3Zzw#KuHq4ZBIYiug=r{t#t;pqhCdooIq!^3a(VGantf7HtQ)O~|V_xP}i`BN&b)BDK|zh}BqC zF2e5|jwB+9m_My-yjo9GAh_vj;r?B{jXq&=6^B+po+~)$J5LC>;=u?A!$fR2QrWm! zO*_6%=sYTo?R|~PDGX6?OV~%_5S7|dwBvE?$H#CA$LQD7FgQl&D{>Tn!WdqsvV99D z@gLCd7)-J#PO~PQVf&C~hcU%Q@dUe!40{gKYy~sy7S6H?X4yMGI|#jtW}4l> z*ai+ll5tqZgjhx>BBObO3uUOFu1n;T+(3AfD3scoGmjD0& literal 0 HcmV?d00001 diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$2.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$2.class new file mode 100644 index 0000000000000000000000000000000000000000..83f2cb5d8430de019c5839fae4dc2a274e214705 GIT binary patch literal 1669 zcmbtVU2hvj6g}gQY_i$LPSYf92sD&5I4;eW@SU$FI4L;TP9P;95E2vb)ZTQxW9_UH z^UPo1rTl?DBb7pUK=h?Zyd!=}rAjT_89ODa95W%k~gbMM@9@7eWVkAM3ez}wgv zzz{Cm$Y5>&Z@}%x6&r72UOR6M65yRd%*oXo>X1J@?G_fAa?neR17a(^nXlN;0asvMC4`2@yAV z)7_V<;WmR-%@36u%2+5F9EixRkhx>bZF9Itd6xXpk5?G3=3XSx>@Gv9AU(m5DfywO zv>JONy3Y3k+Bsd4Rieg;Ao<=KeAaC=(4Cl9Zuu5&uC5;PrNq5Y9N&#*2*HTOV7ep z2csBsFpgCRYq-ELT#-{cd`gKxRAb@IS@_UF0qYJnaLvL;4n9WF!6rU&P(qnuriXZ* zqU@l8EeG59)WK(1CDrwadk)b}&oj*S2=5F}xtk>5&XhTI_CaHI0gRNGHRpE)UB>DP9xn^p46J5jY{Lf^0Np zsKwM7eZVQh*4{piz{o2TiH6XxgYfiKr1ESBXgHO86_cWd{%5Io82bGuWXE!|CjyR} zKtWcWtBPn7nkbP5Q=xIr9OF+`LJF;kxJYUxEPYw}s497&71yP560DQittP2JlttLW z6n)|{^tDT10$B`$reeI2Y*vfV*dQgIrIT~ytq?LnPdk6@k;yVemb zhRWq5^fTPT3>gCqf52WyolD)tU^fX_Km3SvYWeoR|4iP(csICvdITqdFSK(Pr*!2> z;tkATfL2ab?qLKT)hejY8(2jRU!smCZsHJuVV0+=R|)YdE|4{fukjkD4cqn;wryOb uoD8p1)?uVa9^ovrkjp(p;vqFNiCH>GAdgG*Owq3e@G|||6f#6l`uh*D^SL?z literal 0 HcmV?d00001 diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$3.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$3.class new file mode 100644 index 0000000000000000000000000000000000000000..c06214b6e39557c9a9bb2b6e5c5bfc814d02c14b GIT binary patch literal 1666 zcmbtVU2hvj6g^|Fv&m)~J57_cA<$4la9o-#gwK36!AZfvb^<8@!3z`b;A~j$SUc;) zmEeiLzzh8YeMTyU@POJEka$P@6i_8T?u?xhRWhp7NSVEN=G;5?+)${A1mG3y z3}6UX9Aq&!fEVHQ>b$cfTX9WX4|K0aADz*hE}nR8M72<=AgWhHvM+rb z*IbNZ%*8lXU98~}!*Eqj>F_BfLQzYEKWF1D7e%bQ*uZrgZ@YL0B^R4`*F_l>hM6AX zd4#fyDz;o~<2@JeW0h3bBknOoH$BfV+atU)JmqbYfICwn^_c0kk|6X-iHLb3V}^wu z2_EBqhIC#}-971&ZW+V4zNYP|BWkg?xz#i(;t`z;t9^M?5lZp8Sf_VX)``F=Q59vQ zDI+bW&ger<8MgKgXaq)H*;q7$ejS9buOgM_IzYpz9H@j8HS`}#y~EHSJS01opFI_D z(gX^!_qnQyHlc|UY0!#{bM6Fxx)M@oT_hz^D`Dx&lIA|yqg@`SkvfypYLWy*MMN!3 z(f2J&pSlz#ki#%&B*q)b<+K8g4U*w`I=MjJ3L#VUbPAWh11o%w)VBsRL2DmjfCx{~ zI@Up963>uFc$1CZCS0UDJGuUVg$$jw3wOZoApHwmcGmgXl>kGkk*?G6op#!C9~_Sa&hlO+wb!w~(=xZ~ycA@EoQM+xA1YZ9Gpo t8D5~Q!^n*Mh4aitKK}rz2h_|oX6Yb>0xr|jqMr)jY5I34WQd;h_b)czxPSlv literal 0 HcmV?d00001 diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$4.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$4.class new file mode 100644 index 0000000000000000000000000000000000000000..46021edb4ff7c894bbb73840798d068781f7f7f9 GIT binary patch literal 2347 zcmbtW+j1L45Itkb-dNf=j_(G-RRmdr2nI zcVxxLa=IE!SAxwM+L^T+%TEcMk3Wo|u{DA4yqlK-$I_M~v(?h3tXwuXZA$vmZqBsV z%!;MfbzxWm5YU$#M^@%-)AJ;ksfP$6Hbp%Bp0s7omwAPCe#>+UGA}UE7F^!+O+(S8 z^e=ERqo9bQz;L=~?wB_W@4Dp_j7u5mRF`~NqK|0Kb$oflS0aIt{dy~Ixms2`R1{@_ z-eB7>ulvS|YdJo}N7R)lUjm7Ccn`)UaCFr-bK4oS98jnsO|l!Nu9SH~L5-}s)k;n- zT8jBWg{t+&Pbo}1w&3J!*CViu^tar+hK!D3jOZ9eR>QK66}+M2O{@wG?W3UyPse3k z(Xggt9dGHliVYoa;~o0kr{ADW$Gdn>!!;f6!_=^;BZs^Wi4SxXu%*L7QO7oH9VOUI z>;IqCu_>~yf-r1ezp=boWI`~(+gLonbgYpIHBQr(=S$`&nP|7s7kI1smTfRaDyHvJ zd%BIkL)4`}D6Y~l-p0g%ka?p8>94k=K2s|`_OHpMGRF(jo++ufmJJ;r{$#|=<)r7u z&Q7u!W!oM+1nQZwTB!s)D%KfS&mOZ%!rHN#1P>A5-gbj{9@4fcqF3vGN=KPmaMas?)Q9664cVIISrp<) zzC#DWii7CwRgHcC?hyQl+vh!Y%#YFc=l zHq|E*SYvC(Q+T>=>j7BJn^$c{* zKSC5A6Y(dE`BP&13=8-i7jYBI_yQaF64&q*^7xu<@|ytH6eCVS!!w8>Oi3Eg;v}&y zlcDDj57;U;Q5P|W1ksMu*KvgYKte;OhU9&mxKCpEf^3p;jw*^+@pnGIZQ)ZiEsMJ4 g5KaXL4NUSG=Kmbv3I6(MY=BSo8RGw;*Sos^0uyhDO#lD@ literal 0 HcmV?d00001 diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$5.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$5.class new file mode 100644 index 0000000000000000000000000000000000000000..967474e69927502c091a0fedb03cf41a9b30125e GIT binary patch literal 3410 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 A>i_@% literal 0 HcmV?d00001 diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$7.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin$7.class new file mode 100644 index 0000000000000000000000000000000000000000..72d90a892725dfce40dd8ab71d33f4bf4ba7a30f GIT binary patch literal 1129 zcmbVMZEF)j5PtR&b4hy5rPbC(TU%??B(1%E5Cl^S5-JGk3sfug+a_7l3zyw+w|D+7 zp;h#QKfoU)&R#ZSduk+Pq(dR}kdM59iiTc~Ywj7J$UCC7$&k|*epKCM z*qatJ3gW&mqw6pgBqB^>PgC_IJv4dteCg|bhW=FWSrSbv;?KhCXAIev>QS?9+n3@f z9(F|dmUjZ$S!}B=56*b#8+*K&HH|VjZ=@7qE8tNi$lRX>I76}37u2`QyV_UsM1&ty zI21jG^;&zt6YlYk+7pS8+Iy9{92mW63b#bUu=+1AhT^G;!>)Mkn}(LmuqFxLF$e^H zAiIHzeAzz~`a<<=)Ev~&aNuCxK@oEfO2*v6wvA^FcHq&Zr(BMiT4pGx-346sz2nY6 zbTz};UmI@wkrqTY!^{6iBqrh!O*v^@k1P*{0<3b`kOzB zWBUqL;|nsMQpW{abL0qCz#{3(X|RjiSR#vp(v*xmmT`BS@E!RWh)UxU>=IcL)>quJ z@ZM~EM(%g&l0jw;7T7#iSZM;HasyGp3M!O3gL{! literal 0 HcmV?d00001 diff --git a/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.class b/notesolver/build/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.class new file mode 100644 index 0000000000000000000000000000000000000000..260d3ce6ac9354f9201df9e8ae512c75c54a9261 GIT binary patch literal 8936 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 MtNf1^ckQqHKiNmu0RR91 literal 0 HcmV?d00001 diff --git a/notesolver/dist/notesolver.jar b/notesolver/dist/notesolver.jar new file mode 100644 index 0000000000000000000000000000000000000000..52c60d6b1ecdc34b56ac3e16d8982e7eee6a535f GIT binary patch literal 38411 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 Iwe@fR1?y`SWdHyG literal 0 HcmV?d00001 diff --git a/notesolver/src/.vscode/launch.json b/notesolver/src/.vscode/launch.json new file mode 100644 index 0000000..ac60bd5 --- /dev/null +++ b/notesolver/src/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Debug (Launch) - Current File", + "request": "launch", + "mainClass": "${file}" + } + ] +} \ No newline at end of file diff --git a/notesolver/src/.vscode/settings.json b/notesolver/src/.vscode/settings.json new file mode 100644 index 0000000..2970199 --- /dev/null +++ b/notesolver/src/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "java.project.referencedLibraries": [ + "lib/**/*.jar", + "d:\\_dev\\osm\\josm\\josm\\core\\dist\\josm-custom.jar" + ] +} \ No newline at end of file diff --git a/notesolver/src/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.java b/notesolver/src/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.java new file mode 100644 index 0000000..5f30a19 --- /dev/null +++ b/notesolver/src/org/openstreetmap/josm/plugins/notesolver/NoteSolverPlugin.java @@ -0,0 +1,323 @@ +package org.openstreetmap.josm.plugins.notesolver; + +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.openstreetmap.josm.actions.*; +import org.openstreetmap.josm.actions.upload.*; + +import org.openstreetmap.josm.data.*; +import org.openstreetmap.josm.data.notes.*; +import org.openstreetmap.josm.data.osm.*; +import org.openstreetmap.josm.data.osm.NoteData.*; +import org.openstreetmap.josm.data.osm.event.*; + +import org.openstreetmap.josm.gui.*; +import org.openstreetmap.josm.gui.layer.*; +import org.openstreetmap.josm.gui.layer.LayerManager.*; +import org.openstreetmap.josm.gui.progress.ProgressMonitor; + +import org.openstreetmap.josm.plugins.*; + +import java.awt.event.*; +import java.awt.*; +import javax.swing.*; + +public class NoteSolverPlugin extends Plugin { + static JMenu noteSolverMenu; + public List rememberedNotes = new ArrayList<>(); + private List solvedNotes = new ArrayList<>(); + public Note selectedNote; + private int lastChangeSet; + private boolean autoUploadDecision = false; + NoteSolverPlugin me = this; + int maxMenuItemLen = 50; + + public NoteSolverPlugin(final PluginInformation info) { + super(info); + // Create Menu + updateMenu(); + setEnabledMenu(false); + // Register Layer Change Listener for Note Selection and Dataset Change + MainApplication.getLayerManager().addLayerChangeListener(layerChangeListener); + // Register Upload Hook + UploadAction.registerUploadHook(uploadHook, false); + } + + private final UploadHook uploadHook = new UploadHook() { + @Override + public boolean checkUpload(APIDataSet apiDataSet) { + boolean returnValue = true; + if (rememberedNotes != null && rememberedNotes.size() > 0) { + String noteList = ""; + for (Note note : solvedNotes) { + if (rememberedNotes.contains(note)) rememberedNotes.remove(note); + } + for (Note note : rememberedNotes) { + noteList = noteList + (char)13 + (char)10 + noteShortText(note); + } + int outVal = JOptionPane.showConfirmDialog( + null, + "Automatically Resolve Note" + (rememberedNotes.size() > 1 ? "s" : "") + (char)13 + (char)10 + noteList + (char)13 + (char)10 + "?", + null, + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE + ); + if (outVal == JOptionPane.CANCEL_OPTION) { + returnValue = false; + } else { + autoUploadDecision = (outVal == JOptionPane.YES_OPTION); + if (autoUploadDecision) { + String comment = MainApplication.getLayerManager().getEditDataSet().getChangeSetTags().get("comment"); + for (Note note : solvedNotes) { + String noteLink = "Closes https://www.openstreetmap.org/note/" + Long.toString(note.getId()); + comment = comment.replace("; " + noteLink, ""); + comment = comment.replace(noteLink, ""); + } + for (Note note : rememberedNotes) { + String noteLink = "Closes https://www.openstreetmap.org/note/" + Long.toString(note.getId()); + comment = (comment != null ? (comment.contains(noteLink) ? comment : comment + "; " + noteLink) : noteLink); + } + MainApplication.getLayerManager().getEditDataSet().addChangeSetTag("comment", comment); + } + returnValue = true; + } + } + return returnValue; + } + }; + + private final JosmAction forgetNoteAction = new JosmAction() { + private static final long serialVersionUID = 1927873880648933879L; + @Override + public void actionPerformed(ActionEvent event) { + if (selectedNote == null) { + JOptionPane.showMessageDialog(null, "No Note selected."); + } else { + boolean alreadyAdded = false; + if (rememberedNotes != null) { + for(Note note : rememberedNotes) + if (note.getId() == selectedNote.getId()) alreadyAdded = true; + if (alreadyAdded) rememberedNotes.remove(selectedNote); + } + } + updateMenu(); + } + }; + private final JosmAction rememberNoteAction = new JosmAction() { + private static final long serialVersionUID = 1927873880648933880L; + @Override + public void actionPerformed(ActionEvent event) { + if (selectedNote == null) { + JOptionPane.showMessageDialog(null, "No Note selected."); + } else { + boolean alreadyAdded = false; + if (rememberedNotes != null) { + for(Note note : rememberedNotes) + if (note.getId() == selectedNote.getId()) alreadyAdded = true; + if (!alreadyAdded) rememberedNotes.add(selectedNote); + } + } + updateMenu(); + } + }; + + private final NoteDataUpdateListener noteDataUpdateListener = new NoteDataUpdateListener() { + @Override + public void selectedNoteChanged(NoteData noteData) { + selectedNote = noteData.getSelectedNote(); + if (selectedNote != null) { + JPopupMenu contextMenu = new JPopupMenu(); + for (JMenuItem j : mainMenuEntries()) { + contextMenu.add(j); + } + Point p = MainApplication.getMainFrame().getMousePosition(); + contextMenu.setInvoker(MainApplication.getMainFrame().getComponentAt(p)); + contextMenu.setLocation(p); + contextMenu.setEnabled(true); + contextMenu.setVisible(true); + } + } + @Override + public void noteDataUpdated(NoteData noteData) { + // nothing to do here + } + }; + + private final LayerChangeListener layerChangeListener = new LayerChangeListener() { + @Override + public void layerAdded(LayerAddEvent e) { + changeListeners(e.getAddedLayer(), false); + } + + @Override + public void layerRemoving(LayerRemoveEvent e) { + changeListeners(e.getRemovedLayer(), true); + } + + @Override + public void layerOrderChanged(LayerOrderChangeEvent e) { + // nothing to do here + } + public void changeListeners(Layer layer, boolean isRemove) { + if (layer instanceof OsmDataLayer) { + DataSet ds = ((OsmDataLayer) layer).getDataSet(); + if (!isRemove) { + ds.addDataSetListener(dataSetListener); + } else { + ds.removeDataSetListener(dataSetListener); + } + } else if (layer instanceof NoteLayer) { + NoteData notes = ((NoteLayer) layer).getNoteData(); + if (!isRemove) { + notes.addNoteDataUpdateListener(noteDataUpdateListener); + } else { + notes.removeNoteDataUpdateListener(noteDataUpdateListener); + } + } + } + }; + + private final DataSetListener dataSetListener = new DataSetListener() { + @Override + public void wayNodesChanged(WayNodesChangedEvent event) { + } + + @Override + public void tagsChanged(TagsChangedEvent event) { + } + + @Override + public void relationMembersChanged(RelationMembersChangedEvent event) { + } + + @Override + public void primitivesRemoved(PrimitivesRemovedEvent event) { + } + + @Override + public void primitivesAdded(PrimitivesAddedEvent event) { + } + + @Override + public void otherDatasetChange(AbstractDatasetChangedEvent event) + { + if (event.getType() == AbstractDatasetChangedEvent.DatasetEventType.CHANGESET_ID_CHANGED && autoUploadDecision) { + Collection c = event.getPrimitives(); + Iterator oIter = c.iterator(); + int thisChangeSet = oIter.next().getChangesetId(); + if (lastChangeSet != thisChangeSet) { + lastChangeSet = thisChangeSet; + for (Note note : rememberedNotes) { + NoteData noteData = new NoteData(java.util.Collections.singleton(note)); + noteData.closeNote(note, "Resolved with changeset https://www.openstreetmap.org/changeset/" + Integer.toString(thisChangeSet)); + UploadNotesTask uploadNotesTask = new UploadNotesTask(); + ProgressMonitor pm = null; + uploadNotesTask.uploadNotes(noteData, pm); + solvedNotes.add(note); + } + rememberedNotes = new ArrayList<>(); + event.getDataset().addChangeSetTag("comment", ""); + updateMenu(); + } + } + } + + @Override + public void dataChanged(DataChangedEvent event) { + } + + @Override + public void nodeMoved(NodeMovedEvent event) { + } + }; + + public void updateMenu() { + final MainMenu menu = MainApplication.getMenu(); + + if (noteSolverMenu == null) { + noteSolverMenu = menu.addMenu( + "Note Solver", + "Note Solver", + 0, + menu.getDefaultMenuPos(), + "help" + ); + } else { + noteSolverMenu.removeAll(); + } + + if (rememberedNotes != null) { + for (JMenuItem j : mainMenuEntries()) { + noteSolverMenu.add(j); + } + } + noteSolverMenu.addSeparator(); + noteSolverMenu.add(new JMenuItem("List of selected Notes")); + noteSolverMenu.addSeparator(); + if (rememberedNotes != null) { + for(Note note : rememberedNotes) { + JMenuItem jMenuItem = new JMenuItem(noteShortText(note)); + jMenuItem.setToolTipText(note.getFirstComment().toString()); + jMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ev) { + rememberedNotes.remove(note); + updateMenu(); + } + }); + jMenuItem.setEnabled(true); + noteSolverMenu.add(jMenuItem); + } + } + } + + private List mainMenuEntries() { + List returnList = new ArrayList<>(); + JMenuItem addAction = new JMenuItem("Remember Note"); + addAction.setToolTipText("Add the selected Note to the list of Notes that should be automatically closed when uploading a changeset"); + addAction.addActionListener(rememberNoteAction); + addAction.setEnabled((selectedNote != null && rememberedNotes != null && !rememberedNotes.contains(selectedNote) && selectedNote.getState() != Note.State.CLOSED)); + returnList.add(addAction); + JMenuItem removeAction = new JMenuItem("Forget Note"); + removeAction.setToolTipText("Remove the selected Note from the list of Notes that should be automatically closed when uploading a changeset"); + removeAction.addActionListener(forgetNoteAction); + removeAction.setEnabled(selectedNote != null && rememberedNotes != null && rememberedNotes.contains(selectedNote)); + returnList.add(removeAction); + return returnList; + } + + private String noteShortText(Note n) { + String firstComment = n.getFirstComment().toString(); + if (firstComment.length() > maxMenuItemLen) firstComment = firstComment.substring(0, maxMenuItemLen) + "..."; + String menuItemText = + "* " + Long.toString(n.getId()) + " " + + "[" + n.getFirstComment().getUser().getName().toString() + + " @ " + DateFormat.getDateInstance().format(n.getCreatedAt()) + + ": " + firstComment + + "]"; + return menuItemText; + } + + @Override + public void mapFrameInitialized(final MapFrame oldFrame, final MapFrame newFrame) { + if (newFrame == null) + setEnabledMenu(false); + else { + setEnabledMenu(true); + } + } + + private void setEnabledMenu(final boolean isEnabled) { + + for (final Component me : noteSolverMenu.getMenuComponents()) { + if (me instanceof JMenuItem) { + ((JMenuItem) me).setEnabled(isEnabled); + } + } + + } +} \ No newline at end of file