// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.collide.client.collaboration;
import com.google.collide.client.bootstrap.BootstrapSession;
import com.google.collide.client.editor.selection.SelectionModel;
import com.google.collide.dto.client.DtoClientImpls.ClientToServerDocOpImpl;
import com.google.collide.dto.client.DtoClientImpls.DocumentSelectionImpl;
import com.google.collide.dto.client.DtoClientImpls.FilePositionImpl;
import com.google.collide.shared.document.LineInfo;
import com.google.collide.shared.util.ListenerRegistrar.Remover;
/**
* A class that tracks local cursor changes and eventually will aid in
* broadcasting them to the collaborators.
*
*/
class LocalCursorTracker
implements SelectionModel.CursorListener, ClientToServerDocOpCreationParticipant {
private final DocumentCollaborationController collaborationController;
private boolean hasExplicitCursorChange;
private final SelectionModel selectionModel;
private final Remover cursorListenerRemover;
LocalCursorTracker(
DocumentCollaborationController collaborationController, SelectionModel selectionModel) {
this.collaborationController = collaborationController;
this.selectionModel = selectionModel;
cursorListenerRemover = selectionModel.getCursorListenerRegistrar().add(this);
}
@Override
public void onCreateClientToServerDocOp(ClientToServerDocOpImpl message) {
if (!hasExplicitCursorChange) {
return;
}
FilePositionImpl basePosition =
FilePositionImpl.make().setColumn(selectionModel.getBaseColumn()).setLineNumber(
selectionModel.getBaseLineNumber());
FilePositionImpl cursorPosition =
FilePositionImpl.make().setColumn(selectionModel.getCursorColumn()).setLineNumber(
selectionModel.getCursorLineNumber());
DocumentSelectionImpl selection =
DocumentSelectionImpl.make().setBasePosition(basePosition).setCursorPosition(
cursorPosition).setUserId(BootstrapSession.getBootstrapSession().getUserId());
message.setSelection(selection);
// Reset
hasExplicitCursorChange = false;
}
@Override
public void onCursorChange(LineInfo lineInfo, int column, boolean isExplicitChange) {
if (isExplicitChange) {
hasExplicitCursorChange = true;
collaborationController.ensureQueuedDocOp();
}
}
/**
* Forces the next client to server doc op to have our selection included.
*/
void forceSendingSelection() {
hasExplicitCursorChange = true;
}
void teardown() {
cursorListenerRemover.remove();
}
}