package com.yoursway.ide.worksheet.internal.view;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.MessageBox;
import com.yoursway.ide.worksheet.WorksheetStyle;
import com.yoursway.ide.worksheet.internal.controller.Command;
import com.yoursway.ide.worksheet.internal.controller.ResultInsetProvider;
import com.yoursway.swt.styledtext.extended.ExtendedStyledText;
import com.yoursway.utils.annotations.UseFromUIThread;
@UseFromUIThread
public class WorksheetView {
private final WorksheetStyle style;
private final ExtendedStyledText extendedText;
public WorksheetView(Composite parent, WorksheetViewCallback callback, WorksheetStyle style) {
if (style == null)
throw new NullPointerException("style is null");
this.style = style;
extendedText = new ExtendedStyledText(parent, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); //> SWT.WRAP or SWT.H_SCROLL switching
extendedText.setFont(style.worksheetFont());
extendedText.addVerifyKeyListener(callback);
extendedText.addExtendedModifyListener(callback);
}
public boolean multilineSelection() {
Point lines = extendedText.selectedLines();
return lines.x != lines.y;
}
public Iterable<Command> selectedCommands() {
List<Command> commands = new LinkedList<Command>();
Point lines = extendedText.selectedLines();
for (int i = lines.x; i <= lines.y; i++) {
String commandText = commandText(i);
if (commandText.trim().length() == 0)
continue;
final int j = i;
commands.add(new Command(commandText, new ResultInsetProvider() {
@UseFromUIThread
public ResultInset get() {
return inset(j);
}
}));
}
return commands;
}
private String commandText(int lineIndex) {
return extendedText.getLine(lineIndex);
}
@UseFromUIThread
private ResultInset inset(int lineIndex) {
if (extendedText.lineHasInset(lineIndex))
return (ResultInset) extendedText.existingInset(lineIndex);
else
return addInset(lineIndex);
}
private ResultInset addInset(int lineIndex) {
ResultInset inset = new ResultInset(style);
extendedText.addInset(lineIndex, inset);
return inset;
}
public void removeAllInsets() {
for (int i = 0; i < extendedText.getLineCount(); i++) {
extendedText.removeInset(i);
}
}
public boolean inLastLine() {
return extendedText.inLastLine();
}
public void makeNewLineAtEnd() {
extendedText.append("\n");
extendedText.setSelection(extendedText.getCharCount());
}
public void makeInsetsObsolete(int start, int end) {
int firstLine = extendedText.getLineAtOffset(start);
int lastLine = extendedText.getLineAtOffset(end);
for (int i = firstLine; i <= lastLine; i++) {
if (extendedText.lineHasInset(i)) {
ResultInset inset = (ResultInset) extendedText.existingInset(i);
inset.becomeObsolete();
}
}
}
@UseFromUIThread
public void showSelectedText() {
MessageBox messageBox = new MessageBox(extendedText.getShell());
messageBox.setMessage(extendedText.getSelectionText());
messageBox.open();
}
public void lineDown() {
extendedText.lineDown();
}
public boolean isNewLineChar(int offset) {
return extendedText.getText(offset, offset).equals("\n");
}
}