+ if (av.hiddenRepSequences != null\r
+ && av.hiddenRepSequences.containsKey(seq))\r
+ {\r
+ sg = (SequenceGroup) av.hiddenRepSequences.get(seq);\r
+ groupEditing = true;\r
+ }\r
+ }\r
+\r
+ StringBuffer message = new StringBuffer();\r
+ if (groupEditing)\r
+ {\r
+ message.append("Edit group:");\r
+ if (editCommand == null)\r
+ {\r
+ editCommand = new EditCommand("Edit Group");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ message.append("Edit sequence: " + seq.getName());\r
+ String label = seq.getName();\r
+ if (label.length() > 10)\r
+ {\r
+ label = label.substring(0, 10);\r
+ }\r
+ if (editCommand == null)\r
+ {\r
+ editCommand = new EditCommand("Edit " + label);\r
+ }\r
+ }\r
+\r
+ if (insertGap)\r
+ {\r
+ message.append(" insert ");\r
+ }\r
+ else\r
+ {\r
+ message.append(" delete ");\r
+ }\r
+\r
+ message.append(Math.abs(startres - lastres) + " gaps.");\r
+ ap.alignFrame.statusBar.setText(message.toString());\r
+\r
+ //Are we editing within a selection group?\r
+ if (groupEditing\r
+ || (sg != null && sg.getSequences(av.hiddenRepSequences).contains(seq)))\r
+ {\r
+ fixedColumns = true;\r
+\r
+ //sg might be null as the user may only see 1 sequence,\r
+ //but the sequence represents a group\r
+ if (sg == null)\r
+ {\r
+ if (av.hiddenRepSequences == null\r
+ || !av.hiddenRepSequences.containsKey(seq))\r
+ {\r
+ endEditing();\r
+ return;\r
+ }\r
+ sg = (SequenceGroup) av.hiddenRepSequences.get(seq);\r
+ }\r
+\r
+ fixedLeft = sg.getStartRes();\r
+ fixedRight = sg.getEndRes();\r
+\r
+ if ( (startres < fixedLeft && lastres >= fixedLeft)\r
+ || (startres >= fixedLeft && lastres < fixedLeft)\r
+ || (startres > fixedRight && lastres <= fixedRight)\r
+ || (startres <= fixedRight && lastres > fixedRight))\r
+ {\r
+ endEditing();\r
+ return;\r
+ }\r
+\r
+ if (fixedLeft > startres)\r
+ {\r
+ fixedRight = fixedLeft - 1;\r
+ fixedLeft = 0;\r
+ }\r
+ else if (fixedRight < startres)\r
+ {\r
+ fixedLeft = fixedRight;\r
+ fixedRight = -1;\r
+ }\r
+ }\r
+\r
+ if (av.hasHiddenColumns)\r
+ {\r
+ fixedColumns = true;\r
+ int y1 = av.getColumnSelection().getHiddenBoundaryLeft(startres);\r
+ int y2 = av.getColumnSelection().getHiddenBoundaryRight(startres);\r
+\r
+ if ( (insertGap && startres > y1 && lastres < y1)\r
+ || (!insertGap && startres < y2 && lastres > y2))\r
+ {\r
+ endEditing();\r
+ return;\r
+ }\r
+\r
+ //System.out.print(y1+" "+y2+" "+fixedLeft+" "+fixedRight+"~~");\r
+ //Selection spans a hidden region\r
+ if (fixedLeft < y1 && (fixedRight > y2 || fixedRight == -1))\r
+ {\r
+ if (startres >= y2)\r
+ {\r
+ fixedLeft = y2;\r
+ }\r
+ else\r
+ {\r
+ fixedRight = y2 - 1;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (groupEditing)\r
+ {\r
+ Vector vseqs = sg.getSequences(av.hiddenRepSequences);\r
+ int g, groupSize = vseqs.size();\r
+ SequenceI[] groupSeqs = new SequenceI[groupSize];\r
+ for (g = 0; g < groupSeqs.length; g++)\r
+ {\r
+ groupSeqs[g] = (SequenceI) vseqs.elementAt(g);\r
+ }\r
+\r
+ // drag to right\r
+ if (insertGap)\r
+ {\r
+ //If the user has selected the whole sequence, and is dragging to\r
+ // the right, we can still extend the alignment and selectionGroup\r
+ if (sg.getStartRes() == 0\r
+ && sg.getEndRes() == fixedRight\r
+ && sg.getEndRes() == av.alignment.getWidth() - 1\r
+ )\r