Imlemented busy indicator and reload open tabs feature

master
Marco Maccaferri 2018-12-22 12:14:02 +01:00
rodzic ba982cf0b3
commit b0ca689ed2
5 zmienionych plików z 253 dodań i 33 usunięć

Wyświetl plik

@ -78,6 +78,7 @@ import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import com.maccasoft.tools.internal.BusyIndicator;
import com.maccasoft.tools.internal.ImageRegistry;
import jssc.SerialPort;
@ -151,11 +152,12 @@ public class Application {
};
public Application() {
preferences = Preferences.getInstance();
}
public void open() {
display = Display.getDefault();
preferences = Preferences.getInstance();
shell = new Shell(display);
shell.setText(APP_TITLE);
@ -226,6 +228,21 @@ public class Application {
}
try {
preferences.removePropertyChangeListener(preferencesChangeListner);
List<String> openTabs = new ArrayList<String>();
for (int i = 0; i < tabFolder.getItemCount(); i++) {
SourceEditorTab tab = (SourceEditorTab) tabFolder.getItem(i).getData();
if (tab.getFile() != null) {
openTabs.add(tab.getFile().getAbsolutePath());
}
}
preferences.setOpenTabs(openTabs.toArray(new String[openTabs.size()]));
if (tabFolder.getSelection() != null) {
SourceEditorTab tab = (SourceEditorTab) tabFolder.getSelection().getData();
preferences.setSelectedTab(tab.getFile().getAbsolutePath());
}
preferences.save();
} catch (IOException e1) {
e1.printStackTrace();
@ -233,6 +250,78 @@ public class Application {
ImageRegistry.dispose();
}
});
BusyIndicator.showWhile(display, new Runnable() {
@Override
public void run() {
String line;
final String[] openTabs = preferences.getOpenTabs();
if (openTabs == null || openTabs.length == 0 || !preferences.isReloadOpenTabs()) {
return;
}
for (int i = 0; i < openTabs.length; i++) {
File file = new File(openTabs[i]);
StringBuilder sb = new StringBuilder();
try {
if (!file.exists() || file.isDirectory()) {
continue;
}
BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
display.asyncExec(new Runnable() {
@Override
public void run() {
SourceEditorTab tab = new SourceEditorTab(tabFolder, sb.toString());
tab.setText(file.getName());
tab.setToolTipText(file.getAbsolutePath());
tab.setFile(file);
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
tab.getEditor().setFont(preferences.getEditorFont());
}
});
}
display.asyncExec(new Runnable() {
@Override
public void run() {
if (tabFolder.getItemCount() == 0) {
return;
}
SourceEditorTab tab = (SourceEditorTab) tabFolder.getItem(0).getData();
String s = preferences.getSelectedTab();
if (s != null) {
File selectedFile = new File(s);
for (int i = 0; i < tabFolder.getItemCount(); i++) {
SourceEditorTab editorTab = (SourceEditorTab) tabFolder.getItem(i).getData();
if (selectedFile.equals(editorTab.getFile())) {
tab = editorTab;
break;
}
}
}
tabFolder.setSelection(tab.getTabItem());
tab.setFocus();
}
});
}
}, true);
}
void createFileMenu(Menu parent) {
@ -415,11 +504,9 @@ public class Application {
preferences.removeLru(fileToOpen);
return;
}
SourceEditorTab tab = openSourceTab(fileToOpen);
tabFolder.setSelection(tab.getTabItem());
tab.setFocus();
openSourceTab(fileToOpen);
preferences.addLru(fileToOpen);
} catch (IOException e1) {
} catch (Exception e1) {
e1.printStackTrace();
}
}
@ -959,9 +1046,7 @@ public class Application {
if (file.isDirectory()) {
return;
}
SourceEditorTab tab = openSourceTab(file);
tabFolder.setSelection(tab.getTabItem());
tab.setFocus();
openSourceTab(file);
preferences.addLru(file);
}
} catch (Exception e) {
@ -1041,37 +1126,52 @@ public class Application {
if (fileName != null) {
File file = new File(fileName);
try {
SourceEditorTab tab = openSourceTab(file);
tabFolder.setSelection(tab.getTabItem());
tab.setFocus();
} catch (IOException e) {
openSourceTab(file);
preferences.addLru(file);
} catch (Exception e) {
e.printStackTrace();
}
preferences.addLru(file);
}
}
SourceEditorTab openSourceTab(File file) throws IOException {
String line;
StringBuilder sb = new StringBuilder();
void openSourceTab(File file) {
BusyIndicator.showWhile(display, new Runnable() {
if (file.exists()) {
BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\n");
@Override
public void run() {
String line;
StringBuilder sb = new StringBuilder();
if (file.exists()) {
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
display.asyncExec(new Runnable() {
@Override
public void run() {
SourceEditorTab tab = new SourceEditorTab(tabFolder, sb.toString());
tab.setText(file.getName());
tab.setToolTipText(file.getAbsolutePath());
tab.setFile(file);
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
tab.getEditor().setFont(preferences.getEditorFont());
tabFolder.setSelection(tab.getTabItem());
tab.setFocus();
}
});
}
reader.close();
}
SourceEditorTab tab = new SourceEditorTab(tabFolder, sb.toString());
tab.setText(file.getName());
tab.setToolTipText(file.getAbsolutePath());
tab.setFile(file);
tab.getEditor().setShowLineNumbers(preferences.isShowLineNumbers());
tab.getEditor().setFont(preferences.getEditorFont());
return tab;
}, true);
}
private void handleFileSave() throws IOException {

Wyświetl plik

@ -58,6 +58,9 @@ public class Preferences {
String editorFont;
boolean showLineNumbers;
boolean reloadOpenTabs;
String[] openTabs;
String selectedTab;
boolean generateBinary;
boolean generateHex;
@ -72,6 +75,7 @@ public class Preferences {
Preferences() {
showLineNumbers = true;
reloadOpenTabs = true;
generateHex = true;
generateListing = true;
@ -131,6 +135,30 @@ public class Preferences {
changeSupport.firePropertyChange(PROP_SHOW_LINE_NUMBERS, this.showLineNumbers, this.showLineNumbers = showLineNumbers);
}
public boolean isReloadOpenTabs() {
return reloadOpenTabs;
}
public void setReloadOpenTabs(boolean reloadOpenTabs) {
this.reloadOpenTabs = reloadOpenTabs;
}
public String[] getOpenTabs() {
return openTabs;
}
public void setOpenTabs(String[] openTabs) {
this.openTabs = openTabs;
}
public String getSelectedTab() {
return selectedTab;
}
public void setSelectedTab(String selectedTab) {
this.selectedTab = selectedTab;
}
public boolean isGenerateBinary() {
return generateBinary;
}

Wyświetl plik

@ -44,6 +44,7 @@ public class PreferencesDialog extends Dialog {
Text editorFont;
Button editorFontBrowse;
Button showLineNumbers;
Button reloadOpenTabs;
Button generateBinary;
Button generateHex;
@ -123,6 +124,12 @@ public class PreferencesDialog extends Dialog {
showLineNumbers.setText("Show line numbers");
showLineNumbers.setSelection(preferences.isShowLineNumbers());
new Label(composite, SWT.NONE);
reloadOpenTabs = new Button(composite, SWT.CHECK);
reloadOpenTabs.setText("Reload open tabs");
reloadOpenTabs.setSelection(preferences.isReloadOpenTabs());
addSeparator(composite);
label = new Label(composite, SWT.NONE);
@ -282,6 +289,7 @@ public class PreferencesDialog extends Dialog {
preferences.setEditorFont(editorFont.getText().equals(defaultFont) ? null : editorFont.getText());
preferences.setShowLineNumbers(showLineNumbers.getSelection());
preferences.setReloadOpenTabs(reloadOpenTabs.getSelection());
preferences.setGenerateBinary(generateBinary.getSelection());
preferences.setGenerateHex(generateHex.getSelection());

Wyświetl plik

@ -585,7 +585,6 @@ public class SourceEditor {
currentLine = 0;
this.text.setText(text);
this.text.setLineBackground(currentLine, 1, currentLineBackground);
tokenMarker.refreshMultilineComments(text);
undoStack = new Stack<TextChange>();
redoStack = new Stack<TextChange>();

Wyświetl plik

@ -0,0 +1,85 @@
/*
* 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.internal;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class BusyIndicator {
static int nextBusyId = 1;
static final String BUSYID_NAME = "SWT BusyIndicator"; //$NON-NLS-1$
static final String BUSY_CURSOR = "SWT BusyIndicator Cursor"; //$NON-NLS-1$
public static void showWhile(Display display, Runnable runnable) {
showWhile(display, runnable, false);
}
public static void showWhile(Display display, Runnable runnable, boolean fork) {
if (runnable == null) {
SWT.error(SWT.ERROR_NULL_ARGUMENT);
}
if (display == null) {
return;
}
Integer busyId = new Integer(nextBusyId);
nextBusyId++;
Cursor cursor = display.getSystemCursor(SWT.CURSOR_WAIT);
Shell[] shells = display.getShells();
for (int i = 0; i < shells.length; i++) {
Integer id = (Integer) shells[i].getData(BUSYID_NAME);
if (id == null) {
shells[i].setCursor(cursor);
shells[i].setData(BUSYID_NAME, busyId);
}
}
Runnable busyRunnable = new Runnable() {
@Override
public void run() {
try {
runnable.run();
} finally {
display.syncExec(new Runnable() {
@Override
public void run() {
Shell[] shells = display.getShells();
for (int i = 0; i < shells.length; i++) {
Integer id = (Integer) shells[i].getData(BUSYID_NAME);
if (id == busyId) {
shells[i].setCursor(null);
shells[i].setData(BUSYID_NAME, null);
}
}
}
});
}
}
};
if (fork) {
new Thread(busyRunnable).start();
}
else {
busyRunnable.run();
}
}
}