Lines 44-49
Link Here
|
44 |
import org.apache.jmeter.testbeans.gui.TestBeanGUI; |
44 |
import org.apache.jmeter.testbeans.gui.TestBeanGUI; |
45 |
import org.apache.jmeter.testelement.TestElement; |
45 |
import org.apache.jmeter.testelement.TestElement; |
46 |
import org.apache.jmeter.testelement.TestPlan; |
46 |
import org.apache.jmeter.testelement.TestPlan; |
|
|
47 |
import org.apache.jmeter.testelement.property.JMeterProperty; |
48 |
import org.apache.jmeter.testelement.property.PropertyIterator; |
49 |
import org.apache.jmeter.testelement.property.TestElementProperty; |
47 |
import org.apache.jmeter.util.JMeterUtils; |
50 |
import org.apache.jmeter.util.JMeterUtils; |
48 |
import org.apache.jmeter.util.LocaleChangeEvent; |
51 |
import org.apache.jmeter.util.LocaleChangeEvent; |
49 |
import org.apache.jmeter.util.LocaleChangeListener; |
52 |
import org.apache.jmeter.util.LocaleChangeListener; |
Lines 104-110
Link Here
|
104 |
|
107 |
|
105 |
/** The main JMeter frame. */ |
108 |
/** The main JMeter frame. */ |
106 |
private MainFrame mainFrame; |
109 |
private MainFrame mainFrame; |
107 |
|
110 |
|
108 |
/** The main JMeter toolbar. */ |
111 |
/** The main JMeter toolbar. */ |
109 |
private JToolBar toolbar; |
112 |
private JToolBar toolbar; |
110 |
|
113 |
|
Lines 121-133
Link Here
|
121 |
*/ |
124 |
*/ |
122 |
private LoggerPanel loggerPanel; |
125 |
private LoggerPanel loggerPanel; |
123 |
|
126 |
|
124 |
|
|
|
125 |
/** |
127 |
/** |
|
|
128 |
* History for tree states |
129 |
*/ |
130 |
private UndoHistory undoHistory = new UndoHistory(); |
131 |
|
132 |
/** |
126 |
* Private constructor to permit instantiation only from within this class. |
133 |
* Private constructor to permit instantiation only from within this class. |
127 |
* Use {@link #getInstance()} to retrieve a singleton instance. |
134 |
* Use {@link #getInstance()} to retrieve a singleton instance. |
128 |
*/ |
135 |
*/ |
129 |
private GuiPackage(JMeterTreeModel treeModel, JMeterTreeListener treeListener) { |
136 |
private GuiPackage(JMeterTreeModel treeModel, JMeterTreeListener treeListener) { |
130 |
this.treeModel = treeModel; |
137 |
this.treeModel = treeModel; |
|
|
138 |
this.treeModel.addTreeModelListener(undoHistory); |
131 |
this.treeListener = treeListener; |
139 |
this.treeListener = treeListener; |
132 |
JMeterUtils.addLocaleChangeListener(this); |
140 |
JMeterUtils.addLocaleChangeListener(this); |
133 |
} |
141 |
} |
Lines 155-160
Link Here
|
155 |
public static GuiPackage getInstance(JMeterTreeListener listener, JMeterTreeModel treeModel) { |
163 |
public static GuiPackage getInstance(JMeterTreeListener listener, JMeterTreeModel treeModel) { |
156 |
if (guiPack == null) { |
164 |
if (guiPack == null) { |
157 |
guiPack = new GuiPackage(treeModel, listener); |
165 |
guiPack = new GuiPackage(treeModel, listener); |
|
|
166 |
guiPack.undoHistory.add(treeModel, "Created"); |
158 |
} |
167 |
} |
159 |
return guiPack; |
168 |
return guiPack; |
160 |
} |
169 |
} |
Lines 408-415
Link Here
|
408 |
log.debug("Updating current node " + currentNode.getName()); |
417 |
log.debug("Updating current node " + currentNode.getName()); |
409 |
JMeterGUIComponent comp = getGui(currentNode.getTestElement()); |
418 |
JMeterGUIComponent comp = getGui(currentNode.getTestElement()); |
410 |
TestElement el = currentNode.getTestElement(); |
419 |
TestElement el = currentNode.getTestElement(); |
|
|
420 |
int before = getTestElementCheckSum(el); |
411 |
comp.modifyTestElement(el); |
421 |
comp.modifyTestElement(el); |
412 |
currentNode.nameChanged(); // Bug 50221 - ensure label is updated |
422 |
int after = getTestElementCheckSum(el); |
|
|
423 |
if (before != after) { |
424 |
currentNode.nameChanged(); // Bug 50221 - ensure label is updated |
425 |
} |
413 |
} |
426 |
} |
414 |
// The current node is now updated |
427 |
// The current node is now updated |
415 |
currentNodeUpdated = true; |
428 |
currentNodeUpdated = true; |
Lines 464-470
Link Here
|
464 |
* if a subtree cannot be added to the currently selected node |
477 |
* if a subtree cannot be added to the currently selected node |
465 |
*/ |
478 |
*/ |
466 |
public HashTree addSubTree(HashTree subTree) throws IllegalUserActionException { |
479 |
public HashTree addSubTree(HashTree subTree) throws IllegalUserActionException { |
467 |
return treeModel.addSubTree(subTree, treeListener.getCurrentNode()); |
480 |
HashTree hashTree = treeModel.addSubTree(subTree, treeListener.getCurrentNode()); |
|
|
481 |
undoHistory.clear(); |
482 |
undoHistory.add(this.treeModel, "Loaded tree"); |
483 |
return hashTree; |
468 |
} |
484 |
} |
469 |
|
485 |
|
470 |
/** |
486 |
/** |
Lines 527-533
Link Here
|
527 |
public JMeterTreeListener getTreeListener() { |
543 |
public JMeterTreeListener getTreeListener() { |
528 |
return treeListener; |
544 |
return treeListener; |
529 |
} |
545 |
} |
530 |
|
546 |
|
531 |
/** |
547 |
/** |
532 |
* Set the main JMeter toolbar. |
548 |
* Set the main JMeter toolbar. |
533 |
* |
549 |
* |
Lines 546-552
Link Here
|
546 |
public JToolBar getMainToolbar() { |
562 |
public JToolBar getMainToolbar() { |
547 |
return toolbar; |
563 |
return toolbar; |
548 |
} |
564 |
} |
549 |
|
565 |
|
550 |
/** |
566 |
/** |
551 |
* Set the menu item toolbar. |
567 |
* Set the menu item toolbar. |
552 |
* |
568 |
* |
Lines 670-675
Link Here
|
670 |
getTreeModel().clearTestPlan(); |
686 |
getTreeModel().clearTestPlan(); |
671 |
nodesToGui.clear(); |
687 |
nodesToGui.clear(); |
672 |
setTestPlanFile(null); |
688 |
setTestPlanFile(null); |
|
|
689 |
undoHistory.clear(); |
690 |
undoHistory.add(this.treeModel, "Initial Tree"); |
673 |
} |
691 |
} |
674 |
|
692 |
|
675 |
/** |
693 |
/** |
Lines 680-685
Link Here
|
680 |
public void clearTestPlan(TestElement element) { |
698 |
public void clearTestPlan(TestElement element) { |
681 |
getTreeModel().clearTestPlan(element); |
699 |
getTreeModel().clearTestPlan(element); |
682 |
removeNode(element); |
700 |
removeNode(element); |
|
|
701 |
undoHistory.clear(); |
702 |
undoHistory.add(this.treeModel, "Initial Tree"); |
683 |
} |
703 |
} |
684 |
|
704 |
|
685 |
public static void showErrorMessage(final String message, final String title){ |
705 |
public static void showErrorMessage(final String message, final String title){ |
Lines 720-726
Link Here
|
720 |
} |
740 |
} |
721 |
} |
741 |
} |
722 |
} |
742 |
} |
723 |
|
743 |
|
724 |
/** |
744 |
/** |
725 |
* Register process to stop on reload |
745 |
* Register process to stop on reload |
726 |
* @param stoppable |
746 |
* @param stoppable |
Lines 730-736
Link Here
|
730 |
} |
750 |
} |
731 |
|
751 |
|
732 |
/** |
752 |
/** |
733 |
* |
753 |
* |
734 |
* @return List<IStoppable> Copy of IStoppable |
754 |
* @return List<IStoppable> Copy of IStoppable |
735 |
*/ |
755 |
*/ |
736 |
public List<Stoppable> getStoppables() { |
756 |
public List<Stoppable> getStoppables() { |
Lines 746-752
Link Here
|
746 |
public void setMenuItemLoggerPanel(JCheckBoxMenuItem menuItemLoggerPanel) { |
766 |
public void setMenuItemLoggerPanel(JCheckBoxMenuItem menuItemLoggerPanel) { |
747 |
this.menuItemLoggerPanel = menuItemLoggerPanel; |
767 |
this.menuItemLoggerPanel = menuItemLoggerPanel; |
748 |
} |
768 |
} |
749 |
|
769 |
|
750 |
/** |
770 |
/** |
751 |
* Get the menu item LoggerPanel. |
771 |
* Get the menu item LoggerPanel. |
752 |
* |
772 |
* |
Lines 769-772
Link Here
|
769 |
public LoggerPanel getLoggerPanel() { |
789 |
public LoggerPanel getLoggerPanel() { |
770 |
return loggerPanel; |
790 |
return loggerPanel; |
771 |
} |
791 |
} |
|
|
792 |
|
793 |
/** |
794 |
* Navigate up and down in history |
795 |
* |
796 |
* @param offset int |
797 |
*/ |
798 |
public void goInHistory(int offset) { |
799 |
undoHistory.getRelativeState(offset, this.treeModel); |
800 |
} |
801 |
|
802 |
/** |
803 |
* @return true if history contains redo item |
804 |
*/ |
805 |
public boolean canRedo() { |
806 |
return undoHistory.canRedo(); |
807 |
} |
808 |
|
809 |
/** |
810 |
* @return true if history contains undo item |
811 |
*/ |
812 |
public boolean canUndo() { |
813 |
return undoHistory.canUndo(); |
814 |
} |
815 |
|
816 |
/** |
817 |
* Compute checksum of TestElement to detect changes |
818 |
* the method calculates properties checksum to detect testelement |
819 |
* modifications |
820 |
* TODO would be better to override hashCode for TestElement, but I decided to touch it |
821 |
* |
822 |
* @param el {@link TestElement} |
823 |
* @return int checksum |
824 |
*/ |
825 |
private int getTestElementCheckSum(TestElement el) { |
826 |
int ret = el.getClass().hashCode(); |
827 |
PropertyIterator it = el.propertyIterator(); |
828 |
while (it.hasNext()) { |
829 |
JMeterProperty obj = it.next(); |
830 |
if (obj instanceof TestElementProperty) { |
831 |
ret ^= getTestElementCheckSum(((TestElementProperty) obj) |
832 |
.getElement()); |
833 |
} else { |
834 |
ret ^= obj.getName().hashCode(); |
835 |
ret ^= obj.getStringValue().hashCode(); |
836 |
} |
837 |
} |
838 |
return ret; |
839 |
} |
840 |
|
772 |
} |
841 |
} |