blob: 3a177aef8be4ec2d43c15891b6eb913ceb9b9669 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Atlassian and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Atlassian - initial API and implementation
******************************************************************************/
package com.atlassian.connector.eclipse.internal.crucible.ui.annotations;
import com.atlassian.connector.eclipse.internal.crucible.ui.IReviewActionListener;
import com.atlassian.connector.eclipse.internal.crucible.ui.editor.parts.VersionedCommentPart;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* Popup to show the information about the annotation in
*
* @author Shawn Minto
*/
public class CrucibleCommentPopupDialog extends PopupDialog implements IReviewActionListener {
private static final int MAX_WIDTH = 500;
private int maxWidth;
private CrucibleAnnotationHoverInput annotationInput;
private FormToolkit toolkit;
private Composite composite;
private Label focusLabel;
private ScrolledComposite scrolledComposite;
private CrucibleInformationControl informationControl;
private static CrucibleCommentPopupDialog currentPopupDialog;
public CrucibleCommentPopupDialog(Shell parent, int shellStyle) {
super(parent, shellStyle, false, false, false, false, false, null, null);
}
@Override
protected Control createDialogArea(Composite parent) {
if (toolkit == null) {
toolkit = new FormToolkit(getShell().getDisplay());
}
scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL);
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
toolkit.adapt(scrolledComposite);
composite = toolkit.createComposite(scrolledComposite, SWT.NONE);
composite.setLayout(new GridLayout());
scrolledComposite.setContent(composite);
parent.setBackground(toolkit.getColors().getBackground());
getShell().setBackground(toolkit.getColors().getBackground());
return composite;
}
public void dispose() {
currentPopupDialog = null;
close();
toolkit.dispose();
}
public void setFocus() {
getShell().forceFocus();
if (focusLabel != null) {
focusLabel.dispose();
}
if (composite.getChildren().length > 0) {
composite.getChildren()[0].setFocus();
}
Point computeSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
if (computeSize.y > scrolledComposite.getSize().y) {
scrolledComposite.setExpandVertical(false);
composite.setSize(computeSize);
}
}
public Point computeSizeHint() {
int widthHint = MAX_WIDTH;
if (maxWidth < widthHint) {
widthHint = maxWidth;
}
return getShell().computeSize(widthHint, SWT.DEFAULT, true);
}
public void removeFocusListener(FocusListener listener) {
composite.removeFocusListener(listener);
}
public void addFocusListener(FocusListener listener) {
composite.addFocusListener(listener);
}
public boolean isFocusControl() {
//return composite.isFocusControl();
return getShell().getDisplay().getActiveShell() == getShell();
}
public void removeDisposeListener(DisposeListener listener) {
getShell().removeDisposeListener(listener);
}
public void addDisposeListener(DisposeListener listener) {
getShell().addDisposeListener(listener);
}
public Rectangle getBounds() {
return getShell().getBounds();
}
public Rectangle computeTrim() {
return getShell().computeTrim(0, 0, 0, 0);
}
public void setSizeConstraints(int newMaxWidth, int newMaxHeight) {
this.maxWidth = newMaxWidth;
}
public void setLocation(Point location) {
getShell().setLocation(location);
}
public void setSize(int width, int height) {
Point computeSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
if (computeSize.x > width) {
width = computeSize.x;
}
getShell().setSize(width, height);
scrolledComposite.setSize(width, height);
}
public void setInput(Object input) {
if (input instanceof CrucibleAnnotationHoverInput) {
this.annotationInput = (CrucibleAnnotationHoverInput) input;
// clear the composite in case we are re-using it
for (Control control : composite.getChildren()) {
control.dispose();
}
currentPopupDialog = this;
for (CrucibleCommentAnnotation annotation : annotationInput.getCrucibleAnnotations()) {
VersionedCommentPart part = new VersionedCommentPart(annotation.getVersionedComment(),
annotation.getReview(), annotation.getCrucibleFileInfo());
part.hookCustomActionRunListener(this);
toolkit.adapt(part.createControl(composite, toolkit), true, true);
toolkit.adapt(composite);
toolkit.adapt(scrolledComposite);
toolkit.adapt(scrolledComposite.getParent());
getShell().setBackground(toolkit.getColors().getBackground());
}
focusLabel = toolkit.createLabel(composite, "Press 'F2' for focus.");
focusLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(focusLabel);
} else {
input = null;
}
}
public void actionAboutToRun(Action action) {
close();
}
public void actionRan(Action action) {
close();
}
public static CrucibleCommentPopupDialog getCurrentPopupDialog() {
return currentPopupDialog;
}
public void setInformationControl(CrucibleInformationControl crucibleInformationControl) {
this.informationControl = crucibleInformationControl;
}
public CrucibleInformationControl getInformationControl() {
return informationControl;
}
}