/** * @param lifeline the name of a lifeline that may have a non-consuming note box associated to it */ void closeNote(String lifeline) { Note note = pendingNotes.get(lifeline); if (note != null) { int diff = note.getTop() + note.getHeight() - diagram.getVerticalPosition(); if (diff > 0) { diagram.extendLifelines(diff); } pendingNotes.remove(lifeline); } }
public boolean step() throws SyntaxError { Note note = diagram.getDataProvider().getNote(); if (note != null) { freeNoteNumber = Math.max(freeNoteNumber, note.getNumber() + 1); diagram.getPaintDevice().addSequenceElement(note); notes.add(note); closeNote(note.getLocation().getName()); diagram.getFragmentManager().openFragments(); diagram.getPaintDevice().announce(note.getHeight()); note.setTop(diagram.getVerticalPosition()); if (note.isConsuming()) { diagram.extendLifelines(note.getHeight()); } else { pendingNotes.put(note.getLocation().getName(), note); } if (diagram.getDataProvider().getState() != null) { diagram.addToStateMap(note, diagram.getDataProvider().getState()); } diagram.getFragmentManager().clearLabels(); return true; } Pair<Lifeline, Integer> eventAssoc = diagram.getDataProvider().getEventAssociation(); if (eventAssoc != null) { associateEvent(eventAssoc.getFirst(), eventAssoc.getSecond()); return true; } return false; }
public void computeArrowAssociations() { for (Note description : notes) { List<Message> msgs = messageAssociation.get(description.getNumber()); if (msgs != null) { for (Message msg : msgs) { // This can be a pseudo-message ("_") that returns // the control flow to an object. // We just ignore the attempt to uselessly associate a // note to this. if (msg.getArrow() != null) { description.addTarget(msg.getArrow().getAnchor()); } } } List<Pair<Lifeline, Integer>> pairs = eventAssociation.get(description.getNumber()); if (pairs != null) { for (Pair<Lifeline, Integer> pair : pairs) { int x = pair.getFirst().getView().getLeft() + pair.getFirst().getView().getWidth() / 2; Point p = new Point(x, pair.getSecond()); description.addTarget(p); } } } }
/** * If there is a note specified at the current line and the subsequent lines, a {@linkplain Note} * representation is returned, otherwise <tt>null</tt> * * @return a note, if one is specified at the current position in text, otherwise <tt>null</tt> */ public Note getNote() throws SyntaxError { if (section == 0) { throw new IllegalStateException("not all objects have been read"); } if (currentLine() == null) { throw new IllegalStateException("nothing to read"); } String[] parts = grep.parse("\\s*(\\*|\\+)(\\d+)\\s*(.+)", currentLine()); if (parts == null) { return null; } boolean consuming = parts[0].equals("+"); int number = -1; try { number = Integer.parseInt(parts[1]); } catch (NumberFormatException nfe) { /* empty */ } if (number < 0) { throw new SyntaxError(this, "bad note number: " + parts[1]); } String obj = parts[2]; Lifeline line = diagram.getLifeline(obj); if (line == null) { throw new SyntaxError(this, obj + " does not exist"); } int oldBegin = getLineBegin(); int oldEnd = getLineEnd(); line = line.getRightmost(); List<String> desc = new LinkedList<String>(); boolean more; do { if (!advance(false)) { reset(oldBegin, oldEnd); throw new SyntaxError(this, "The note is not closed."); } more = !currentLine().trim().equals(parts[0] + parts[1]); } while (more && desc.add(currentLine())); if (desc.size() == 0) { reset(oldBegin, oldEnd); throw new SyntaxError(this, "The note is empty."); } String[] noteText = desc.toArray(new String[0]); URI link = null; if (noteText.length == 1) { String linkString = noteText[0].trim(); if (linkString.startsWith("link:")) { try { linkString = linkString.substring(5).trim(); link = new URI(linkString); if (link.getPath() == null) { throw new SyntaxError(this, "Empty path in URI: " + linkString); } noteText[0] = link.getPath(); } catch (URISyntaxException e) { throw new SyntaxError(this, "Bad URI syntax: " + e.getMessage()); } } } Note note = new Note(line, number, noteText, consuming); note.setLink(link); return note; }