package senseiTests.domainsTest; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; //import sensei.util.Debug; import sensei.util.Error; import sensei.util.ErrorHandler; import sensei.util.IntWrapper; import sensei.middleware.domains.BehaviourOnViewChanges; import sensei.middleware.domains.Property; import senseiTests.middleware.domainsTest.StateTransferType; public class UIFrame extends JFrame implements ActionListener, ItemListener, MouseListener, ErrorHandler, DynamicInfoPrintable { //************************************************************************************* //**************************** CONSTRUCTOR ******************************************** //************************************************************************************* public UIFrame(UIUser user, Answerer answerer) { super(TITLE); this.user = user; this.answerer = answerer; minimumSubgroupId = new IntWrapper(sensei.gms.Consts.EVERY_MEMBER_ID); wrapper = new IntWrapper(); init(); initMenu(); initPopupMenus(); answerer.setListener(eventsPanel); subgroups = new TreeMap(); joined=transfered=false; lastGroupCreated=0; addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent evt){ exit(); }}); pack(); int x = (int) getGraphicsConfiguration().getBounds().getWidth(); int y = (int) getGraphicsConfiguration().getBounds().getHeight(); setLocation(x/10+new java.util.Random().nextInt(2*(x/5)), y/10+new java.util.Random().nextInt(2*(y/5))); show(); Error.setErrorHandler(this); } public void clear(final UIPropertiesUser propertiesUser, final BehaviourOnViewChanges behaviour, final CoordinatorElectionMode ceMode, final boolean automatic, final boolean showEvents, final boolean enableProperties, final boolean enableDynamicSubgroups) { this.propertiesUser = propertiesUser; SwingUtilities.invokeLater(new Runnable(){ public void run() { subgroups = new TreeMap(); joined=transfered=false; lastGroupCreated=0; eventsPanel.clear(); menuModeME.setEnabled(true); menuModeNME.setEnabled(true); menuModeNMB.setEnabled(true); if (behaviour==BehaviourOnViewChanges.MembersOnTransferExcludedFromGroup) menuModeME.setSelected(true); else if (behaviour==BehaviourOnViewChanges.StatelessMembersDoNotBelongToGroup) menuModeNME.setSelected(true); else menuModeNMB.setSelected(true); if (ceMode==CoordinatorElectionMode.InfrastructureControlled) menuCoordinatorInfrastructure.setSelected(true); else if (ceMode==CoordinatorElectionMode.SelectedByWeights) menuCoordinatorWeights.setSelected(true); else menuCoordinatorSelection.setSelected(true); menuSubgroupsAutomatic.setSelected(automatic); menuSubgroupsEvents.setSelected(showEvents); menuEnableDynamic.setSelected(enableDynamicSubgroups); menuGroupJoin.setEnabled(true); menuGroupLeave.setEnabled(false); menuPropertiesUpdate.setEnabled(false); menuCoordinatorWeights.setEnabled(false); menuProperties.setEnabled(false); menuEnableProperties.setEnabled(true); menuEnableProperties.setSelected(enableProperties); popupPropertiesAutomaticUpdate.setSelected(enableProperties); menuSubgroups.setEnabled(true); joined=transfered=false; subgroupsPanel.removeAll(); subgroups.clear(); menuSubgroups.setEnabled(true); menuCoordinatorSelection.setEnabled(true); menuCoordinatorInfrastructure.setEnabled(true); menuEnableDynamic.setEnabled(true); pack(); } }); } //************************************************************************************* //**************************** DYNAMIC INFO PRINTABLE ********************************* //************************************************************************************* public void showCreatedDynamicGroup(int subgroupId, StateTransferType type, String info) { eventsPanel.showCreatedDynamicGroup(subgroupId, type, info); } public void showRemovedDynamicGroup(int subgroupId, String info) { eventsPanel.showRemovedDynamicGroup(subgroupId, info); } //************************************************************************************* //**************************** MESSAGE ************************************************ //************************************************************************************* public void showMessage(String s, String title) { JOptionPane.showMessageDialog(this, s, title,JOptionPane.INFORMATION_MESSAGE); } public void showMessage(String s) { showMessage(s, TITLE); } public void showError(String s) { showMessage(s, "Fatal error"); } public void showError(Exception ex) { ex.printStackTrace(); showMessage(ex.toString(), "Fatal error"); } public void showError(String area, Exception ex) { ex.printStackTrace(); showMessage(ex.toString(), "Fatal error on " + area); } //************************************************************************************* //**************************** REQUEST INT ******************************************** //************************************************************************************* /** * Request an integer for the user, returning -1 if cancel is pressed */ int requestInt(String message, int shownValue) { Object answer = JOptionPane.showInputDialog(this, message, TITLE,JOptionPane.QUESTION_MESSAGE, null, null, new Integer(shownValue)); return answer==null? -1 : Integer.valueOf((String)answer).intValue(); } //************************************************************************************* //**************************** COLOUR PANEL METHODS *********************************** //************************************************************************************* public void createColourPanel(IntWrapper id, StateTransferType type, StateChanger stateChanger) { //Debug.assert(!subgroups.containsKey(id),Consts.AREA,"UIFrame::createColourPanel::1"); ColoursInfoPanel panel = new ColoursInfoPanel(this,stateChanger,id.i,StateTransferTypeConverter.asString(type)); subgroups.put(id, panel); int pos = subgroups.subMap(minimumSubgroupId, id).size(); subgroupsPanel.add(panel, pos); lastGroupCreated=id.i; pack(); } public void removeColourPanel(int id) { ColoursInfoPanel panel = (ColoursInfoPanel) subgroups.remove(new IntWrapper(id)); //Debug.assert(panel!=null,Consts.AREA,"UIFrame::removeColourPanel::1"); subgroupsPanel.remove(panel); pack(); } public void setStateOnColourPanel(int id, String state) { wrapper.i=id; ColoursInfoPanel panel = (ColoursInfoPanel)(subgroups.get(wrapper)); //Debug.assert(panel!=null,Consts.AREA,"UIFrame::setStateOnColourPanel::"+id); panel.setState(state); } public void enableUserInteractionOnColourPanel(IntWrapper where) { if (transfered) { ColoursInfoPanel panel = (ColoursInfoPanel) subgroups.get(where); //Debug.assert(panel!=null,Consts.AREA,"UIFrame::enableUserInteractionOnColourPanel::1"); panel.enableUserInteraction(); } } void enableUserInteractionOnEveryColourPanel() { Iterator it = subgroups.values().iterator(); while(it.hasNext()) ((ColoursInfoPanel)(it.next())).enableUserInteraction(); } //************************************************************************************* //**************************** STATE TRANSFERED *************************************** //************************************************************************************* public void stateTransfered() { if (joined && !transfered) { menuSubgroups.setEnabled(true); enableUserInteractionOnEveryColourPanel(); transfered=true; } } //************************************************************************************* //**************************** PRIVATE ************************************************ //************************************************************************************* void init() { JPanel superSubgroupsPanel = new JPanel(new BorderLayout()); subgroupsPanel = new JPanel(new GridLayout(0,1)); superSubgroupsPanel.add(subgroupsPanel, BorderLayout.NORTH); info=new JPanel(new BorderLayout()); infoDim = new JPanel(new GridLayout(1,0)); info.add(infoDim, BorderLayout.CENTER); JPanel panel = new JPanel(new BorderLayout()); panel.add(superSubgroupsPanel, BorderLayout.NORTH); panel.add(info, BorderLayout.CENTER); // if (sensei.gms.Trace.TRACE) // { // sensei.gms.TraceGraphical tg = new sensei.gms.TraceGraphical(false, false); // sensei.gms.Trace.addTracer(tg); // panel.add(tg,BorderLayout.SOUTH); // } getContentPane().add(panel); stateTransferPanel = new StateTransferInfoPanel(answerer); eventsPanel = new StateTransferInfoListingPanel(); propertiesPanel = new PropertiesPanel(); }; void initMenu() { JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); { JMenu menuGroup = new JMenu("Group"); menuGroup.setMnemonic(KeyEvent.VK_G); menuBar.add(menuGroup); { menuGroupJoin = new JMenuItem("Join", KeyEvent.VK_J); menuGroup.add(menuGroupJoin); menuGroupJoin.addActionListener(this); menuGroupLeave = new JMenuItem("Leave", KeyEvent.VK_L); menuGroup.add(menuGroupLeave); menuGroupLeave.addActionListener(this); menuGroup.addSeparator(); menuGroupExit = new JMenuItem("Exit", KeyEvent.VK_X); menuGroup.add(menuGroupExit); menuGroupExit.addActionListener(this); } JMenu menuFeatures = new JMenu("Features"); menuFeatures.setMnemonic(KeyEvent.VK_F); menuBar.add(menuFeatures); { JMenu menuMode = new JMenu("Behaviour"); menuMode.setMnemonic(KeyEvent.VK_B); menuFeatures.add(menuMode); { ButtonGroup group = new ButtonGroup(); menuModeME = new JRadioButtonMenuItem("Members on transfer excluded",true); menuModeME.setMnemonic(KeyEvent.VK_M); group.add(menuModeME); menuMode.add(menuModeME); menuModeNME = new JRadioButtonMenuItem("New members excluded",false); menuModeNME.setMnemonic(KeyEvent.VK_N); group.add(menuModeNME); menuMode.add(menuModeNME); menuModeNMB = new JRadioButtonMenuItem("New members belong to the group",false); menuModeNMB.setMnemonic(KeyEvent.VK_B); group.add(menuModeNMB); menuMode.add(menuModeNMB); } JMenu menuCoordinator = new JMenu("Coordinator election"); menuCoordinator.setMnemonic(KeyEvent.VK_C); menuFeatures.add(menuCoordinator); { ButtonGroup group = new ButtonGroup(); menuCoordinatorInfrastructure = new JRadioButtonMenuItem("Infrastructure controlled",true); menuCoordinatorInfrastructure.setMnemonic(KeyEvent.VK_I); group.add(menuCoordinatorInfrastructure); menuCoordinator.add(menuCoordinatorInfrastructure); menuCoordinatorWeights = new JRadioButtonMenuItem("Selected by \"weight\" property",false); menuCoordinatorWeights.setMnemonic(KeyEvent.VK_W); group.add(menuCoordinatorWeights); menuCoordinator.add(menuCoordinatorWeights); menuCoordinatorSelection = new JRadioButtonMenuItem("Selected by the user",false); menuCoordinatorSelection.setMnemonic(KeyEvent.VK_U); group.add(menuCoordinatorSelection); menuCoordinator.add(menuCoordinatorSelection); } menuEnableProperties = new JCheckBoxMenuItem("Enable properties"); menuEnableProperties.setMnemonic(KeyEvent.VK_P); menuFeatures.add(menuEnableProperties); menuEnableProperties.addItemListener(this); menuEnableDynamic = new JCheckBoxMenuItem("Enable dynamic subgroups"); menuEnableDynamic.setMnemonic(KeyEvent.VK_D); menuFeatures.add(menuEnableDynamic); } menuSubgroups = new JMenu("Subgroups"); menuSubgroups.setMnemonic(KeyEvent.VK_S); menuBar.add(menuSubgroups); { menuSubgroupsCreate = new JMenuItem("Create ...", KeyEvent.VK_C); menuSubgroupsCreate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK)); menuSubgroups.add(menuSubgroupsCreate); menuSubgroupsCreate.addActionListener(this); menuSubgroupsRemove = new JMenuItem("Remove ...", KeyEvent.VK_R); menuSubgroupsRemove.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK)); menuSubgroups.add(menuSubgroupsRemove); menuSubgroupsRemove.addActionListener(this); menuSubgroups.addSeparator(); menuSubgroupsAutomatic = new JCheckBoxMenuItem("Automatic transfer"); menuSubgroupsAutomatic.setMnemonic(KeyEvent.VK_A); menuSubgroups.add(menuSubgroupsAutomatic); menuSubgroupsAutomatic.addItemListener(this); menuSubgroupsAutomaticDelay = new JMenuItem("Automatic delay ...", KeyEvent.VK_D); menuSubgroups.add(menuSubgroupsAutomaticDelay); menuSubgroupsAutomaticDelay.addActionListener(this); menuSubgroups.addSeparator(); menuSubgroupsEvents = new JCheckBoxMenuItem("Show events"); menuSubgroupsEvents.setMnemonic(KeyEvent.VK_E); menuSubgroupsEvents.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_9, ActionEvent.ALT_MASK)); menuSubgroups.add(menuSubgroupsEvents); menuSubgroupsEvents.addItemListener(this); menuSubgroupsClearEvents = new JMenuItem("Clear events", KeyEvent.VK_C); menuSubgroups.add(menuSubgroupsClearEvents); menuSubgroupsClearEvents.addActionListener(this); } menuProperties = new JMenu("Properties"); menuProperties.setMnemonic(KeyEvent.VK_P); menuBar.add(menuProperties); { menuPropertiesAdd = new JMenuItem("Add ...", KeyEvent.VK_A); menuPropertiesAdd.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4, ActionEvent.ALT_MASK)); menuProperties.add(menuPropertiesAdd); menuPropertiesAdd.addActionListener(this); menuPropertiesRem = new JMenuItem("Remove ...", KeyEvent.VK_R); menuPropertiesRem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5, ActionEvent.ALT_MASK)); menuProperties.add(menuPropertiesRem); menuPropertiesRem.addActionListener(this); menuProperties.addSeparator(); menuPropertiesUpdate = new JMenuItem("Update properties", KeyEvent.VK_U); menuProperties.add(menuPropertiesUpdate); menuPropertiesUpdate.addActionListener(this); menuPropertiesAutomaticUpdate = new JCheckBoxMenuItem("Automatic update"); menuPropertiesAutomaticUpdate.setMnemonic(KeyEvent.VK_T); menuProperties.add(menuPropertiesAutomaticUpdate); menuPropertiesAutomaticUpdate.addItemListener(this); menuProperties.addSeparator(); menuPropertiesWindow = new JCheckBoxMenuItem("Show properties"); menuPropertiesWindow.setMnemonic(KeyEvent.VK_S); menuPropertiesWindow.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_8, ActionEvent.ALT_MASK)); menuProperties.add(menuPropertiesWindow); menuPropertiesWindow.addItemListener(this); } JMenu menuHelp = new JMenu("Help"); menuHelp.setMnemonic(KeyEvent.VK_H); menuBar.add(Box.createHorizontalGlue()); menuBar.add(menuHelp); { menuHelpAbout = new JMenuItem("About", KeyEvent.VK_A); menuHelp.add(menuHelpAbout); menuHelpAbout.addActionListener(this); } } menuGroupJoin.setEnabled(true); menuGroupLeave.setEnabled(false); menuSubgroups.setEnabled(true); menuProperties.setEnabled(false); menuPropertiesUpdate.setEnabled(false); } void initPopupMenus() { popupStateTransfer = new JPopupMenu(); popupSubgroupsTransferHide = new JMenuItem("Hide", KeyEvent.VK_H); popupStateTransfer.add(popupSubgroupsTransferHide); popupSubgroupsTransferHide.addActionListener(this); popupEvents = new JPopupMenu(); popupEventsClear = new JMenuItem("Clear", KeyEvent.VK_C); popupEvents.add(popupEventsClear); popupEventsClear.addActionListener(this); popupEventsHide = new JMenuItem("Hide", KeyEvent.VK_H); popupEvents.add(popupEventsHide); popupEventsHide.addActionListener(this); popupProperties = new JPopupMenu(); popupPropertiesAdd = new JMenuItem("Add property...", KeyEvent.VK_A); popupProperties.add(popupPropertiesAdd); popupPropertiesAdd.addActionListener(this); popupPropertiesRemove = new JMenuItem("Remove property...", KeyEvent.VK_R); popupProperties.add(popupPropertiesRemove); popupPropertiesRemove.addActionListener(this); popupProperties.addSeparator(); popupPropertiesUpdate = new JMenuItem("Update", KeyEvent.VK_U); popupProperties.add(popupPropertiesUpdate); popupPropertiesUpdate.addActionListener(this); popupPropertiesAutomaticUpdate = new JCheckBoxMenuItem("Automatic update"); popupPropertiesAutomaticUpdate.setMnemonic(KeyEvent.VK_T); popupProperties.add(popupPropertiesAutomaticUpdate); popupPropertiesAutomaticUpdate.addItemListener(this); popupProperties.addSeparator(); popupPropertiesHide = new JMenuItem("Hide", KeyEvent.VK_H); popupProperties.add(popupPropertiesHide); popupPropertiesHide.addActionListener(this); stateTransferPanel.addMouseListener(this); eventsPanel.addMouseListener(this); propertiesPanel.addMouseListener(this); } void enableProperties() { properties=true; propertiesUser.enableProperties(); menuEnableProperties.setEnabled(false); menuCoordinatorWeights.setEnabled(true); menuProperties.setEnabled(true); menuPropertiesWindow.setSelected(true); } //************************************************************************************* //**************************** SET PROPERTIES ***************************************** //************************************************************************************* public void setProperties(int member, Property[] properties) { propertiesPanel.setProperties(member, properties); } public void clearProperties() { propertiesPanel.clearProperties(); } //************************************************************************************* //**************************** ADD PROPERTY ******************************************* //************************************************************************************* public void addProperty(Property[] properties) { Property toAdd = new PropertySelector(properties, this, "Add property", "Name", "Value", true, true).getInput(); if (toAdd!=null) propertiesUser.addProperty(toAdd); } //************************************************************************************* //**************************** REMOVE PROPERTY **************************************** //************************************************************************************* public void removeProperty(Property[] properties) { Property toRem = new PropertySelector(properties, this, "Remove property", "Name", "Value", false, true).getInput(); if (toRem!=null) propertiesUser.removeProperty(toRem); } //************************************************************************************* //**************************** ACTION PERFORMED *************************************** //************************************************************************************* public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj==menuGroupJoin) doJoin(); else if (obj==menuGroupLeave) user.doLeave(); else if (obj==menuGroupExit) exit(); else if (((obj==menuPropertiesAdd) || (obj==popupPropertiesAdd)) && properties) addProperty(propertiesUser.getProperties()); else if (((obj==menuPropertiesRem) || (obj==popupPropertiesRemove)) && properties) removeProperty(propertiesUser.getProperties()); else if ((obj==menuSubgroupsClearEvents) || (obj==popupEventsClear)) eventsPanel.clear(); else if (((obj==menuPropertiesUpdate) || (obj==popupPropertiesUpdate)) && joined && properties) propertiesUser.updateProperties(); else if (obj==popupSubgroupsTransferHide) menuSubgroupsAutomatic.setSelected(true); else if (obj==popupEventsHide) menuSubgroupsEvents.setSelected(false); else if (obj==popupPropertiesHide) menuPropertiesWindow.setSelected(false); else if ((obj==menuCoordinatorWeights) || (obj==menuCoordinatorSelection)) user.changedCoordinatorElection(menuCoordinatorWeights.isSelected()); else if (obj==menuSubgroupsCreate) { if (joined) { StateKeeper generator = new StateKeeper(); generator.generateRandomState(); String[] state = generator.getSubStates(); String displayState = generator.toString(); generator=null; SubgroupRequester subgroupRequester = new SubgroupRequester(this, displayState); if (subgroupRequester.getInput()) user.doCreateDynamicSubgroup(state,subgroupRequester.getType(),subgroupRequester.getWait()); } else { SubgroupRequester subgroupRequester = new SubgroupRequester(this,lastGroupCreated+1); if (subgroupRequester.getInput()) user.doCreateSubgroup(subgroupRequester.getId(), subgroupRequester.getType()); } } else if (obj==menuSubgroupsRemove) { int n=requestInt("Subgroup id:", lastGroupCreated); if (n!=-1) user.doRemoveSubgroup(n); } else if (obj==menuSubgroupsAutomaticDelay) { int n=requestInt("Delay (ms) on automatic mode: ", answerer.getAutomaticDelay()); if (n>=0) answerer.setAutomaticDelay(n); else showMessage("Delay cannot be negative"); } else if (obj==menuHelpAbout) showMessage("State Transfer Tester, (c)LuisM Pena, August 2001: testing the state transfer capabilities on Sensei", "About"); } //************************************************************************************* //**************************** JOIN METHODS ******************************************* //************************************************************************************* void joined(int id) { if (!joined) { menuGroupJoin.setEnabled(false); menuGroupLeave.setEnabled(true); menuSubgroups.setEnabled(false); menuModeME.setEnabled(false); menuModeNME.setEnabled(false); menuModeNMB.setEnabled(false); menuPropertiesUpdate.setEnabled(true); if (menuCoordinatorInfrastructure.isSelected()) { menuCoordinatorWeights.setEnabled(false); menuCoordinatorSelection.setEnabled(false); } else { menuCoordinatorWeights.addActionListener(this); menuCoordinatorSelection.addActionListener(this); } menuCoordinatorInfrastructure.setEnabled(false); menuEnableProperties.setEnabled(false); menuEnableDynamic.setEnabled(false); joined=true; setTitle(TITLE + " - member " + id); } } public void doJoin() { if (!joined) { final BehaviourOnViewChanges behaviour = menuModeME.isSelected()? BehaviourOnViewChanges.MembersOnTransferExcludedFromGroup : menuModeNME.isSelected()? BehaviourOnViewChanges.StatelessMembersDoNotBelongToGroup : BehaviourOnViewChanges.StatelessMembersBelongToGroup; final CoordinatorElectionMode ceMode = menuCoordinatorInfrastructure.isSelected()? CoordinatorElectionMode.InfrastructureControlled : menuCoordinatorWeights.isSelected()? CoordinatorElectionMode.SelectedByWeights : CoordinatorElectionMode.SelectedByUser; menuGroupJoin.setEnabled(false); new Thread(){ public void run() { if (!user.doJoin(behaviour, ceMode, menuEnableDynamic.isSelected())) menuGroupJoin.setEnabled(true); } }.start(); Thread.yield(); } } //************************************************************************************* //**************************** ITEM STATE CHANGED ************************************* //************************************************************************************* public void itemStateChanged(ItemEvent e) { Object source = e.getItem(); boolean selected=e.getStateChange()==ItemEvent.SELECTED; if (source==menuSubgroupsAutomatic) { if (selected) { answerer.setAutomatic(); info.remove(stateTransferPanel); } else { answerer.setManual(stateTransferPanel); info.add(stateTransferPanel,BorderLayout.SOUTH); } pack(); } else if (source==menuSubgroupsEvents) { if (selected) infoDim.add(eventsPanel); else infoDim.remove(eventsPanel); pack(); } else if ((source==menuEnableProperties) && selected) enableProperties(); else if ((source==menuPropertiesWindow) && properties) { if (selected) infoDim.add(propertiesPanel); else infoDim.remove(propertiesPanel); pack(); } else if (source==menuPropertiesAutomaticUpdate) { if (selected!=popupPropertiesAutomaticUpdate.isSelected()) //keeping synchronize popup and menu { popupPropertiesAutomaticUpdate.setSelected(selected); propertiesUser.updatePropertiesAutomatically(selected, joined); } } else if (source==popupPropertiesAutomaticUpdate) { if (selected!=menuPropertiesAutomaticUpdate.isSelected()) //keeping synchronize popup and menu { menuPropertiesAutomaticUpdate.setSelected(selected); propertiesUser.updatePropertiesAutomatically(selected, joined); } } } //************************************************************************************* //**************************** MOUSE LISTENER ***************************************** //************************************************************************************* public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { Component o = e.getComponent(); if (o==stateTransferPanel) popupStateTransfer.show(o, e.getX(), e.getY()); else if (o==eventsPanel) popupEvents.show(o, e.getX(), e.getY()); else if (o==propertiesPanel) popupProperties.show(o, e.getX(), e.getY()); } } //************************************************************************************* //**************************** DEBUG OUTPUT OPERATIONS ******************************** //************************************************************************************* /** * Output the debug message **/ public boolean handleError(String area, String debugMessage) { System.out.println(debugMessage); showMessage(debugMessage, area); return false; } /** * Output the debug message **/ public boolean handleException(String area, Exception ex) { ex.printStackTrace(); showMessage(ex.toString(), area); return false; } public void showCoordinatorElector(int target, int coordinator) { eventsPanel.showCoordinatorElector(target, coordinator); } //************************************************************************************* //**************************** OPERATIONS TO ANSWER TO USER EVENTS ******************** //************************************************************************************* void exit() { user.onExit(); } //************************************************************************************* //**************************** DATA *************************************************** //************************************************************************************* JMenuItem menuGroupJoin, menuGroupLeave, menuGroupExit, menuSubgroupsCreate, menuSubgroupsRemove, menuHelpAbout; JMenuItem menuSubgroupsAutomaticDelay, menuPropertiesAdd, menuPropertiesRem; JMenuItem menuSubgroupsClearEvents, menuPropertiesUpdate; JCheckBoxMenuItem menuEnableProperties, menuEnableDynamic; JMenuItem popupSubgroupsTransferHide, popupEventsClear, popupEventsHide, popupPropertiesAdd; JMenuItem popupPropertiesRemove, popupPropertiesUpdate, popupPropertiesHide; JPopupMenu popupStateTransfer, popupEvents, popupProperties; JCheckBoxMenuItem menuSubgroupsAutomatic, menuSubgroupsEvents, menuPropertiesWindow, menuPropertiesAutomaticUpdate; JCheckBoxMenuItem popupPropertiesAutomaticUpdate; JRadioButtonMenuItem menuModeME, menuModeNME, menuModeNMB; JRadioButtonMenuItem menuCoordinatorInfrastructure, menuCoordinatorWeights, menuCoordinatorSelection; JMenu menuSubgroups, menuProperties; JPanel info, infoDim; JPanel subgroupsPanel; PropertiesPanel propertiesPanel; StateTransferInfoPanel stateTransferPanel; StateTransferInfoListingPanel eventsPanel; SortedMap subgroups; //IntWrapper, ColoursInfoPanel Answerer answerer; UIUser user; UIPropertiesUser propertiesUser; IntWrapper minimumSubgroupId, wrapper; int lastGroupCreated; boolean joined, transfered, properties; final static String TITLE = "State Transfer tester"; }