kopia lustrzana https://github.com/maccasoft/z80-tools
Added status line
rodzic
9a75ea1622
commit
0ea2fc776d
|
@ -32,6 +32,10 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.core.databinding.observable.Realm;
|
import org.eclipse.core.databinding.observable.Realm;
|
||||||
|
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
|
||||||
|
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
|
||||||
|
import org.eclipse.core.databinding.observable.value.WritableValue;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.jface.databinding.swt.DisplayRealm;
|
import org.eclipse.jface.databinding.swt.DisplayRealm;
|
||||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
import org.eclipse.jface.dialogs.MessageDialog;
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
@ -43,6 +47,8 @@ import org.eclipse.swt.custom.CTabFolder;
|
||||||
import org.eclipse.swt.custom.CTabFolder2Adapter;
|
import org.eclipse.swt.custom.CTabFolder2Adapter;
|
||||||
import org.eclipse.swt.custom.CTabFolderEvent;
|
import org.eclipse.swt.custom.CTabFolderEvent;
|
||||||
import org.eclipse.swt.custom.CTabItem;
|
import org.eclipse.swt.custom.CTabItem;
|
||||||
|
import org.eclipse.swt.custom.CaretEvent;
|
||||||
|
import org.eclipse.swt.custom.CaretListener;
|
||||||
import org.eclipse.swt.custom.SashForm;
|
import org.eclipse.swt.custom.SashForm;
|
||||||
import org.eclipse.swt.custom.StyledText;
|
import org.eclipse.swt.custom.StyledText;
|
||||||
import org.eclipse.swt.events.DisposeEvent;
|
import org.eclipse.swt.events.DisposeEvent;
|
||||||
|
@ -91,11 +97,26 @@ public class Application {
|
||||||
SashForm sashForm2;
|
SashForm sashForm2;
|
||||||
CTabFolder tabFolder;
|
CTabFolder tabFolder;
|
||||||
Console console;
|
Console console;
|
||||||
|
StatusLine statusLine;
|
||||||
|
|
||||||
SerialTerminal terminal;
|
SerialTerminal terminal;
|
||||||
|
|
||||||
Preferences preferences;
|
Preferences preferences;
|
||||||
|
|
||||||
|
WritableValue tabFolderSelection;
|
||||||
|
|
||||||
|
final CaretListener caretListener = new CaretListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void caretMoved(CaretEvent event) {
|
||||||
|
StyledText text = (StyledText) event.widget;
|
||||||
|
int offset = text.getCaretOffset();
|
||||||
|
int y = text.getLineAtOffset(offset);
|
||||||
|
int x = offset - text.getOffsetAtLine(y);
|
||||||
|
statusLine.setCaretPosition(String.format("%d : %d ", y + 1, x + 1));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public Application() {
|
public Application() {
|
||||||
preferences = Preferences.getInstance();
|
preferences = Preferences.getInstance();
|
||||||
}
|
}
|
||||||
|
@ -145,6 +166,9 @@ public class Application {
|
||||||
control = createContents(shell);
|
control = createContents(shell);
|
||||||
control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
||||||
|
|
||||||
|
statusLine = new StatusLine(shell);
|
||||||
|
statusLine.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||||
|
|
||||||
shell.open();
|
shell.open();
|
||||||
|
|
||||||
shell.addListener(SWT.Close, new Listener() {
|
shell.addListener(SWT.Close, new Listener() {
|
||||||
|
@ -638,15 +662,17 @@ public class Application {
|
||||||
sashForm2 = new SashForm(sashForm1, SWT.VERTICAL);
|
sashForm2 = new SashForm(sashForm1, SWT.VERTICAL);
|
||||||
sashForm2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
sashForm2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
||||||
|
|
||||||
tabFolder = new CTabFolder(sashForm2, SWT.BORDER);
|
tabFolder = new CTabFolder(sashForm2, SWT.BORDER) {
|
||||||
tabFolder.setTabHeight((int) (fontMetrics.getHeight() * 1.5));
|
|
||||||
tabFolder.addSelectionListener(new SelectionAdapter() {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent e) {
|
public void setSelection(int index) {
|
||||||
|
super.setSelection(index);
|
||||||
|
CTabItem tabItem = tabFolder.getSelection();
|
||||||
|
tabFolderSelection.setValue(tabItem != null ? tabItem.getData() : null);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
};
|
||||||
|
tabFolder.setTabHeight((int) (fontMetrics.getHeight() * 1.5));
|
||||||
tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter() {
|
tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -656,6 +682,30 @@ public class Application {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
tabFolderSelection = new WritableValue();
|
||||||
|
tabFolderSelection.addValueChangeListener(new IValueChangeListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleValueChange(ValueChangeEvent event) {
|
||||||
|
SourceEditorTab tab = (SourceEditorTab) event.diff.getOldValue();
|
||||||
|
if (tab != null) {
|
||||||
|
tab.getEditor().removeCaretListener(caretListener);
|
||||||
|
}
|
||||||
|
tab = (SourceEditorTab) event.diff.getNewValue();
|
||||||
|
if (tab != null) {
|
||||||
|
StyledText text = tab.getEditor().getStyledText();
|
||||||
|
int offset = text.getCaretOffset();
|
||||||
|
int y = text.getLineAtOffset(offset);
|
||||||
|
int x = offset - text.getOffsetAtLine(y);
|
||||||
|
statusLine.setCaretPosition(String.format("%d : %d ", y + 1, x + 1));
|
||||||
|
tab.getEditor().addCaretListener(caretListener);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
statusLine.setCaretPosition("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
console = new Console(sashForm2);
|
console = new Console(sashForm2);
|
||||||
console.getStyledText().addListener(SWT.MouseDown, new Listener() {
|
console.getStyledText().addListener(SWT.MouseDown, new Listener() {
|
||||||
|
|
||||||
|
@ -1040,7 +1090,12 @@ public class Application {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
IProgressMonitor monitor = statusLine.getProgressMonitor();
|
||||||
|
monitor.beginTask("Compile", IProgressMonitor.UNKNOWN);
|
||||||
|
|
||||||
compile(builder, reader, name, file);
|
compile(builder, reader, name, file);
|
||||||
|
|
||||||
|
monitor.done();
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
@ -1289,6 +1344,9 @@ public class Application {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
IProgressMonitor monitor = statusLine.getProgressMonitor();
|
||||||
|
monitor.beginTask("Compile", IProgressMonitor.UNKNOWN);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Source source = compile(builder, reader, name, file);
|
Source source = compile(builder, reader, name, file);
|
||||||
if (source == null) {
|
if (source == null) {
|
||||||
|
@ -1304,18 +1362,25 @@ public class Application {
|
||||||
});
|
});
|
||||||
|
|
||||||
SerialPort serialPort = terminal.getSerialPort();
|
SerialPort serialPort = terminal.getSerialPort();
|
||||||
|
StringBuilder sb = buildIntelHexString(new ArrayList<Line>(source.getLines()));
|
||||||
|
|
||||||
|
monitor.beginTask("Upload", sb.length());
|
||||||
out.println("Sending to serial port " + serialPort.getPortName() + " ...");
|
out.println("Sending to serial port " + serialPort.getPortName() + " ...");
|
||||||
|
|
||||||
StringBuilder sb = buildIntelHexString(new ArrayList<Line>(source.getLines()));
|
|
||||||
for (int i = 0; i < sb.length(); i++) {
|
for (int i = 0; i < sb.length(); i++) {
|
||||||
serialPort.writeInt(sb.charAt(i));
|
serialPort.writeInt(sb.charAt(i));
|
||||||
|
monitor.worked(1);
|
||||||
}
|
}
|
||||||
|
while (serialPort.getOutputBufferBytesCount() > 0) {
|
||||||
|
Thread.sleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
out.println("Done");
|
out.println("Done");
|
||||||
|
monitor.done();
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Marco Maccaferri 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.maccasoft.tools;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.jface.dialogs.Dialog;
|
||||||
|
import org.eclipse.jface.dialogs.ProgressIndicator;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.FontMetrics;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
|
||||||
|
public class StatusLine implements IProgressMonitor {
|
||||||
|
|
||||||
|
Display display;
|
||||||
|
Composite container;
|
||||||
|
|
||||||
|
Label messageLabel;
|
||||||
|
Label caretPositionLabel;
|
||||||
|
ProgressIndicator progressBar;
|
||||||
|
|
||||||
|
public StatusLine(Composite parent) {
|
||||||
|
display = parent.getDisplay();
|
||||||
|
|
||||||
|
container = new Composite(parent, SWT.NONE);
|
||||||
|
|
||||||
|
GC gc = new GC(parent);
|
||||||
|
FontMetrics fontMetrics = gc.getFontMetrics();
|
||||||
|
gc.dispose();
|
||||||
|
|
||||||
|
messageLabel = new Label(container, SWT.NONE);
|
||||||
|
messageLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
|
||||||
|
|
||||||
|
addSeparator();
|
||||||
|
|
||||||
|
caretPositionLabel = new Label(container, SWT.CENTER);
|
||||||
|
GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false);
|
||||||
|
layoutData.widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics, 10);
|
||||||
|
caretPositionLabel.setLayoutData(layoutData);
|
||||||
|
|
||||||
|
addSeparator();
|
||||||
|
|
||||||
|
Label label = new Label(container, SWT.NONE);
|
||||||
|
layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false);
|
||||||
|
layoutData.widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics, 35);
|
||||||
|
label.setLayoutData(layoutData);
|
||||||
|
|
||||||
|
addSeparator();
|
||||||
|
|
||||||
|
progressBar = new ProgressIndicator(container, SWT.HORIZONTAL);
|
||||||
|
layoutData = new GridData(GridData.GRAB_VERTICAL);
|
||||||
|
layoutData.widthHint = 128;
|
||||||
|
progressBar.setLayoutData(layoutData);
|
||||||
|
|
||||||
|
GridLayout layout = new GridLayout(container.getChildren().length, false);
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
container.setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addSeparator() {
|
||||||
|
Label label = new Label(container, SWT.SEPARATOR);
|
||||||
|
GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, false, true);
|
||||||
|
layoutData.heightHint = 24;
|
||||||
|
label.setLayoutData(layoutData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLayoutData(Object data) {
|
||||||
|
container.setLayoutData(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getLayoutData() {
|
||||||
|
return container.getLayoutData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String text) {
|
||||||
|
messageLabel.setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCaretPosition(String text) {
|
||||||
|
caretPositionLabel.setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IProgressMonitor getProgressMonitor() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beginTask(String name, final int totalWork) {
|
||||||
|
final boolean animated = (totalWork == UNKNOWN || totalWork == 0);
|
||||||
|
display.syncExec(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (progressBar == null || progressBar.isDisposed()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!progressBar.getVisible()) {
|
||||||
|
progressBar.setVisible(true);
|
||||||
|
container.layout();
|
||||||
|
}
|
||||||
|
if (!animated) {
|
||||||
|
progressBar.beginTask(totalWork);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
progressBar.beginAnimatedTask();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void done() {
|
||||||
|
display.syncExec(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (progressBar == null || progressBar.isDisposed()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
progressBar.sendRemainingWork();
|
||||||
|
progressBar.done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void subTask(String name) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void worked(int work) {
|
||||||
|
internalWorked(work);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void internalWorked(final double work) {
|
||||||
|
display.syncExec(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (progressBar == null || progressBar.isDisposed()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
progressBar.worked(work);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCanceled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCanceled(boolean value) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTaskName(String name) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Ładowanie…
Reference in New Issue