Skip to content

Commit

Permalink
Make Plugin really loadable at runtime, some code refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
kmpoppe committed May 14, 2020
1 parent bf08c5b commit 5673e35
Show file tree
Hide file tree
Showing 14 changed files with 134 additions and 99 deletions.
2 changes: 1 addition & 1 deletion notesolver/MANIFEST
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ 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
Plugin-Date: 2020-05-14T06:58:47.130
Author: Kai Michael Poppe
Plugin-Link: https://wiki.openstreetmap.org/wiki/User:Kmpoppe/Plugins#
noteSolver
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified notesolver/dist/notesolver.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

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.*;
Expand All @@ -21,29 +19,32 @@
import org.openstreetmap.josm.gui.progress.ProgressMonitor;

import org.openstreetmap.josm.plugins.*;
import org.openstreetmap.josm.spi.preferences.Config;

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class NoteSolverPlugin extends Plugin {
static JMenu noteSolverMenu;
public List<Note> rememberedNotes = new ArrayList<>();
private List<Note> solvedNotes = new ArrayList<>();
public NoteList rememberedNotes = new NoteList();
private NoteList solvedNotes = new NoteList();
public Note selectedNote;
private int lastChangeSet;
private boolean autoUploadDecision = false;
NoteSolverPlugin me = this;
int maxMenuItemLen = 50;
String crLf = "" + (char)13 + (char)10;

public NoteSolverPlugin(final PluginInformation info) {
super(info);
// Create Menu
createMenu();
updateMenu();
setEnabledMenu(false);
// Register Layer Change Listener for Note Selection and Dataset Change

MainApplication.getLayerManager().addLayerChangeListener(layerChangeListener);
// ...andFire... added so that the Plugin can be loaded at runtime and
// the event handlers get loaded anyway.
MainApplication.getLayerManager().addAndFireLayerChangeListener(layerChangeListener);
// Register Upload Hook
UploadAction.registerUploadHook(uploadHook, false);
}
Expand All @@ -54,15 +55,15 @@ 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);
}
for (Note note : solvedNotes)
if (rememberedNotes.containsNote(note)) rememberedNotes.remove(note);

for (Note note : rememberedNotes)
noteList = noteList + crLf + noteShortText(note);

int outVal = JOptionPane.showConfirmDialog(
null,
"Automatically Resolve Note" + (rememberedNotes.size() > 1 ? "s" : "") + (char)13 + (char)10 + noteList + (char)13 + (char)10 + "?",
"Automatically Resolve Note" + (rememberedNotes.size() > 1 ? "s" : "") + crLf + noteList + crLf + "?",
null,
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE
Expand All @@ -74,12 +75,12 @@ public boolean checkUpload(APIDataSet apiDataSet) {
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());
String noteLink = "Closes " + getUrl(note, linkTypes.NOTE);
comment = comment.replace("; " + noteLink, "");
comment = comment.replace(noteLink, "");
}
for (Note note : rememberedNotes) {
String noteLink = "Closes https://www.openstreetmap.org/note/" + Long.toString(note.getId());
String noteLink = "Closes " + getUrl(note, linkTypes.NOTE);
comment = (comment != null ? (comment.contains(noteLink) ? comment : comment + "; " + noteLink) : noteLink);
}
MainApplication.getLayerManager().getEditDataSet().addChangeSetTag("comment", comment);
Expand All @@ -98,12 +99,8 @@ 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);
}
if (rememberedNotes != null && rememberedNotes.containsNote(selectedNote))
rememberedNotes.remove(selectedNote);
}
updateMenu();
}
Expand All @@ -115,12 +112,8 @@ 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);
}
if (rememberedNotes != null && !rememberedNotes.containsNote(selectedNote))
rememberedNotes.add(selectedNote);
}
updateMenu();
}
Expand All @@ -132,9 +125,8 @@ public void selectedNoteChanged(NoteData noteData) {
selectedNote = noteData.getSelectedNote();
if (selectedNote != null) {
JPopupMenu contextMenu = new JPopupMenu();
for (JMenuItem j : mainMenuEntries()) {
contextMenu.add(j);
}
for (JMenuItem menuItem : mainMenuEntries(menuTypes.MAIN))
contextMenu.add(menuItem);
Point p = MainApplication.getMainFrame().getMousePosition();
contextMenu.setInvoker(MainApplication.getMainFrame().getComponentAt(p));
contextMenu.setLocation(p);
Expand Down Expand Up @@ -163,7 +155,8 @@ public void layerRemoving(LayerRemoveEvent e) {
public void layerOrderChanged(LayerOrderChangeEvent e) {
// nothing to do here
}
public void changeListeners(Layer layer, boolean isRemove) {

public final void changeListeners(Layer layer, boolean isRemove) {
if (layer instanceof OsmDataLayer) {
DataSet ds = ((OsmDataLayer) layer).getDataSet();
if (!isRemove) {
Expand All @@ -183,44 +176,22 @@ public void changeListeners(Layer layer, boolean isRemove) {
};

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<? extends OsmPrimitive> c = event.getPrimitives();
Iterator<? extends OsmPrimitive> oIter = c.iterator();
int thisChangeSet = oIter.next().getChangesetId();
int thisChangeSet = event.getPrimitives().iterator().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));
noteData.closeNote(note, "Resolved with changeset " + getUrl(thisChangeSet, linkTypes.CHANGESET));
UploadNotesTask uploadNotesTask = new UploadNotesTask();
ProgressMonitor pm = null;
uploadNotesTask.uploadNotes(noteData, pm);
solvedNotes.add(note);
}
rememberedNotes = new ArrayList<>();
rememberedNotes = new NoteList();
event.getDataset().addChangeSetTag("comment", "");
updateMenu();
}
Expand All @@ -234,11 +205,30 @@ public void dataChanged(DataChangedEvent event) {
@Override
public void nodeMoved(NodeMovedEvent event) {
}

@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) {
}
};

public void updateMenu() {
private void createMenu() {
final MainMenu menu = MainApplication.getMenu();

if (noteSolverMenu == null) {
noteSolverMenu = menu.addMenu(
"Note Solver",
Expand All @@ -247,47 +237,56 @@ public void updateMenu() {
menu.getDefaultMenuPos(),
"help"
);
} else {
noteSolverMenu.removeAll();
}
}

if (rememberedNotes != null) {
for (JMenuItem j : mainMenuEntries()) {
noteSolverMenu.add(j);
}
public void updateMenu() {
noteSolverMenu.removeAll();
for (JMenuItem j : mainMenuEntries(menuTypes.MAIN)) {
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);
}
if (rememberedNotes != null && rememberedNotes.size() > 0) {
noteSolverMenu.add(new JMenuItem("List of selected Notes"));
noteSolverMenu.addSeparator();
for (JMenuItem j : mainMenuEntries(menuTypes.NOTELIST))
noteSolverMenu.add(j);
}
}

private List<JMenuItem> mainMenuEntries() {
private List<JMenuItem> mainMenuEntries(Enum<menuTypes> menuType) {
List<JMenuItem> 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);
if (menuType == menuTypes.MAIN) {
boolean bEnaPre = selectedNote != null && rememberedNotes != null;
boolean bEnaLst = (bEnaPre && rememberedNotes.contains(selectedNote));
boolean bEnaCls = (bEnaPre && selectedNote.getState() == Note.State.CLOSED);
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(bEnaPre && !bEnaLst && !bEnaCls);
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(bEnaPre && bEnaLst);
returnList.add(removeAction);
} else if (menuType == menuTypes.NOTELIST) {
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);
returnList.add(jMenuItem);
}
}
}
return returnList;
}

Expand All @@ -313,12 +312,48 @@ public void mapFrameInitialized(final MapFrame oldFrame, final MapFrame newFrame
}

private void setEnabledMenu(final boolean isEnabled) {

for (final Component me : noteSolverMenu.getMenuComponents()) {
if (me instanceof JMenuItem) {
((JMenuItem) me).setEnabled(isEnabled);
for (final Component menuItem : noteSolverMenu.getMenuComponents()) {
if (menuItem instanceof JMenuItem) {
((JMenuItem) menuItem).setEnabled(isEnabled);
}
}

}
}

private String getUrl(Object inputObject, Enum<linkTypes> linkType) {
String returnValue = "";
String customServerUrl = Config.getPref().get("osm-server.url");
String serverUrl =
(customServerUrl != null && customServerUrl != "" ?
customServerUrl.replace(".org/api", ".org") :
"https://www.openstreetmap.org");
if (!serverUrl.endsWith("/")) serverUrl += "/";
Long thisNumber = 0L;
if (linkType == linkTypes.NOTE) {
thisNumber = ((Note)inputObject).getId();
} else if (linkType == linkTypes.CHANGESET) {
thisNumber = (Long)inputObject;
}
if (thisNumber > 0L) {
returnValue = serverUrl + linkType.name().toLowerCase() + "/" + Long.toString(thisNumber);
}
return returnValue;
}
private enum linkTypes {
NOTE, CHANGESET
};
private enum menuTypes {
MAIN, NOTELIST
};
}

class NoteList extends ArrayList<Note> {
private static final long serialVersionUID = 1L;
public boolean containsNote(Note checkNote) {
return
this.stream()
.filter((note) -> note.getId() == checkNote.getId())
.findFirst()
.orElse(null)
!= null;
}
}

0 comments on commit 5673e35

Please sign in to comment.