/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2006 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others.
*
*See COPYING for Details
*
*This program is free software; you can redistribute it and/or
*modify it under the terms of the GNU General Public License
*as published by the Free Software Foundation; either version 2
*of the License, or (at your option) any later version.
*
*This program is distributed in the hope that it will be useful,
*but WITHOUT ANY WARRANTY; without even the implied warranty of
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*GNU General Public License for more details.
*
*You should have received a copy of the GNU General Public License
*along with this program; if not, write to the Free Software
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* Created on Mar 10, 2004
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package plugins.collaboration.jabber.mindmap;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import plugins.collaboration.jabber.view.MapSharingWizardView;
import freemind.controller.actions.generated.instance.RevertXmlAction;
import freemind.modes.mindmapmode.MindMapController;
import freemind.modes.mindmapmode.actions.xml.ActionPair;
/**
* @author RReppel
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class MapSharingController {
//The wizard is implemented as a state machine.
private final int STATE_NOT_CONNECTED = 1;
private final int STATE_CONNECTED = 2;
private final int STATE_SENT_SHARE_REQUEST_PENDING = 3;
/** Waiting for a user to accept or decline the sharing of a map. */
private final int STATE_RECEIVED_SHARE_REQUEST_PENDING = 4;
private final int STATE_SHARING_MAP = 5;
//TODO: Make Jabber server port configurable.
private final int JABBER_SERVER_PORT = 5222;
private int state;
private MapSharingWizardView jabberConnectionWizardView;
private MapSharingController mapSharingWizardController;
private MindMapController controller;
private JabberListener mapSharingListener;
private JabberSender sender;
private String mapSharingRequestingUser;
private String frameTitle; //The title of the FreeMind window.
//When sharing, the window is postfixed to indicate state, e.g.
// "Connected".
//frameTitle is used to re-set the title to its original value later.
private boolean isSendingEnabled = true;
/**
* mapContent is the marshalled map of the others party. If we accept
* sharing, this map is displayed.
*/
private String mapContent;
private String mapFileName;
public MapSharingController(
MapSharingWizardView jabberConnectionWizardView,
MindMapController controller) {
this.jabberConnectionWizardView = jabberConnectionWizardView;
this.controller = controller;
this.mapSharingWizardController = this; //Need an instance of this in
// the listener classes,
//to enable JabberListener to react to accepting/declining map share
// invitations.
setState(STATE_NOT_CONNECTED);
addListeners();
//TODO: Evil hack. Need to retrieve the title here for real
// application.
//Also, this can change when a new map is created...
frameTitle = "Freemind";
}
private void addListeners() {
jabberConnectionWizardView
.addCloseButtonMouseListener(new CloseButtonClickListener());
jabberConnectionWizardView
.addNextButtonMouseListener(new NextButtonClickListener());
jabberConnectionWizardView
.addBackButtonMouseListener(new BackButtonClickListener());
jabberConnectionWizardView
.addAcceptButtonMouseListener(new AcceptButtonClickListener());
jabberConnectionWizardView
.addDeclineButtonMouseListener(new DeclineButtonClickListener());
}
private class CloseButtonClickListener implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
//TODO: Need to set state to a previous state. Either connected or
// not_connected.
jabberConnectionWizardView.hide();
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent arg0) {
}
}
private class NextButtonClickListener implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
if (state == STATE_CONNECTED) {
sender = new JabberSender(mapSharingListener.getSession(),
MapSharingController.this);
// register action listener:
getController().getActionFactory().registerFilter(sender);
if (jabberConnectionWizardView.isShareMapSelected()) {
setState(STATE_SENT_SHARE_REQUEST_PENDING);
jabberConnectionWizardView.showSelectUserDialog();
} else {
//Close the wizard, wait until somebody shares a map:
//TODO: Information message needed.
jabberConnectionWizardView.hide();
} //endif
} else if (state == STATE_NOT_CONNECTED) {
//TODO: Error handling - what about failed connections, etc.?
// Should display error dialog.
mapSharingListener = new JabberListener(controller,
mapSharingWizardController, jabberConnectionWizardView
.getServername(), JABBER_SERVER_PORT,
jabberConnectionWizardView.getUsername(),
jabberConnectionWizardView.getPassword());
setState(STATE_CONNECTED);
jabberConnectionWizardView.showMapSharingSelectionDialog();
} else if (state == STATE_SENT_SHARE_REQUEST_PENDING) {
//Ask the selected user if map sharing is acceptable.
sender.setShareMapUser(jabberConnectionWizardView
.getMapShareUserName());
sender.sendMapSharingRequest(jabberConnectionWizardView
.getUsername()
+ "@" + jabberConnectionWizardView.getServername(),
jabberConnectionWizardView.getMapShareUserName());
jabberConnectionWizardView.showAwaitMapSharingMessage();
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent arg0) {
}
}
private class BackButtonClickListener implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
if (state == STATE_CONNECTED) {
setState(STATE_NOT_CONNECTED);
jabberConnectionWizardView.showConnectToServerDialog();
} else if (state == STATE_CONNECTED) {
//TODO: Track previous state here (the user could have been
// coming from the '"connect to server' dialog.)
//For now, always return to the start state.
setState(STATE_SENT_SHARE_REQUEST_PENDING);
jabberConnectionWizardView.showMapSharingSelectionDialog();
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent arg0) {
}
}
private class AcceptButtonClickListener implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
if (state == STATE_RECEIVED_SHARE_REQUEST_PENDING) {
//Indicate that the the requested map sharing has been
// accepted:
sender.sendMapSharingInvitationResponse(
jabberConnectionWizardView.getUsername() + "@"
+ jabberConnectionWizardView.getServername(),
mapSharingRequestingUser, true);
setState(STATE_SHARING_MAP);
sender.setShareMapUser(mapSharingRequestingUser);
sender.isMapShared(true);
jabberConnectionWizardView.hide();
RevertXmlAction action = controller.revertAction
.createRevertXmlAction(mapContent, null,
mapFileName);
// no undo possible.
ActionPair pair = new ActionPair(action, null);
controller.getActionFactory().executeAction(pair);
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent arg0) {
}
}
private class DeclineButtonClickListener implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
if (state == STATE_RECEIVED_SHARE_REQUEST_PENDING) {
setState(STATE_CONNECTED);
sender.sendMapSharingInvitationResponse(
jabberConnectionWizardView.getUsername() + "@"
+ jabberConnectionWizardView.getServername(),
mapSharingRequestingUser, false);
sender.isMapShared(false);
jabberConnectionWizardView.hide();
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent arg0) {
}
}
/**
* Called by the JabberListener to indicate that a user has accepted or
* declined an invitation to share a map.
*
* @param isAccepted
*/
public void setMapShareRequestAccepted(String userName, boolean isAccepted) {
if (state == STATE_SENT_SHARE_REQUEST_PENDING) {
if (isAccepted) {
setState(STATE_SHARING_MAP);
sender.setShareMapUser(userName);
sender.isMapShared(true);
//TODO: Send current mind map to share user.
/*
* MindMapXMLElement mapElement = new
* MindMapXMLElement(controller.getFrame()); try { StringWriter
* sw = new StringWriter();
*
* sw.write(" <map version=\"" +
* controller.getFrame().getFreemindVersion()+"\">\n");
* MindMapMapModel mindMapNodeModel = (MindMapMapModel)
* controller.getView().getModel();
* mindMapNodeModel.saveInternal(sw, true); // save(sw,
* (MindMapMapModel) controller.getView().getModel().getRoot());
* sw.write(" </map>\n");
*
* sender.sendMap(sw.getBuffer().toString()); } catch(Exception
* e) { freemind.main.Resources.getInstance().logException(e); }
*/
jabberConnectionWizardView.showSharingAcceptedMessage(userName);
} else {
setState(STATE_CONNECTED);
sender.isMapShared(false);
jabberConnectionWizardView.showSharingDeclinedMessage(userName);
}
} //endif
}
public void setMapSharingRequested(String username, String mapContent,
String mapFileName) {
setState(STATE_RECEIVED_SHARE_REQUEST_PENDING);
mapSharingRequestingUser = username;
this.mapContent = mapContent;
this.mapFileName = mapFileName;
jabberConnectionWizardView
.showMapShareAcceptDeclineMessage(mapSharingRequestingUser);
}
public void showMapSharingDialogue() {
if (state == STATE_SHARING_MAP || state == STATE_CONNECTED) {
//TODO: Ask "Are you sure you want to stop sharing?"
sender.sendMapSharingStopRequest();
stopSharing();
} else {
jabberConnectionWizardView.showConnectToServerDialog();
}
}
/**
* Stops sharing the current map and disconnects from server.
*
*/
private void stopSharing() {
mapSharingListener.getSession().disconnect();
sender.mapShared = false;
setState(STATE_NOT_CONNECTED);
}
/**
* Called by the JabberListener when the other user no longer shares his/her
* map.
*
* @param username
*/
public void setSharingStopped(String username) {
stopSharing();
jabberConnectionWizardView.showSharingStoppedMessage(username);
}
/**
* Sets the new state of the map sharing controller and updates the Freemind
* window title to indicate the state.
*
* @param newState
*/
private void setState(int newState) {
state = newState;
//TODO: Hack alert. Window title setting belongs into a view...
//Set the window title:
switch (newState) {
case STATE_CONNECTED:
//TODO: Update resource files.
controller.getFrame().setTitle(frameTitle + " - " + "Connected");
// controller.getFrame().getFreeMindMenuBar().getMenu(0).getItem(7).setText("Disconnect");
break;
case STATE_NOT_CONNECTED:
controller.getFrame().setTitle(frameTitle);
//TODO: Update resource files.
//Change the "File->Share" menu item to be "File->Share"
// if(controller.getFrame().getFreeMindMenuBar() != null)
// controller.getFrame().getFreeMindMenuBar().getMenu(0).getItem(7).setText("Share");
break;
case STATE_SENT_SHARE_REQUEST_PENDING:
break;
case STATE_RECEIVED_SHARE_REQUEST_PENDING:
break;
case STATE_SHARING_MAP:
//TODO: Update resource files.
controller.getFrame().setTitle(frameTitle + " - " + "Sharing Map");
//Change the "File->Share" menu item to be "File->Stop Sharing"
// if(controller.getFrame().getFreeMindMenuBar() != null)
// controller.getFrame().getFreeMindMenuBar().getMenu(0).getItem(7).setText("Stop
// Sharing");
break;
default:
} //endswitch
}
public MindMapController getController() {
return controller;
}
/**
* @param b
*/
public void setSendingEnabled(boolean b) {
this.isSendingEnabled = b;
}
public boolean isSendingEnabled() {
return isSendingEnabled;
}
}