From b0ca689ed23093c456530988b63d2c59b6a6d04e Mon Sep 17 00:00:00 2001 From: Marco Maccaferri Date: Sat, 22 Dec 2018 12:14:02 +0100 Subject: [PATCH] Imlemented busy indicator and reload open tabs feature --- src/com/maccasoft/tools/Application.java | 164 ++++++++++++++---- src/com/maccasoft/tools/Preferences.java | 28 +++ .../maccasoft/tools/PreferencesDialog.java | 8 + .../maccasoft/tools/editor/SourceEditor.java | 1 - .../tools/internal/BusyIndicator.java | 85 +++++++++ 5 files changed, 253 insertions(+), 33 deletions(-) create mode 100644 src/com/maccasoft/tools/internal/BusyIndicator.java diff --git a/src/com/maccasoft/tools/Application.java b/src/com/maccasoft/tools/Application.java index 4999589..e8ee927 100644 --- a/src/com/maccasoft/tools/Application.java +++ b/src/com/maccasoft/tools/Application.java @@ -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 openTabs = new ArrayList(); + 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 { diff --git a/src/com/maccasoft/tools/Preferences.java b/src/com/maccasoft/tools/Preferences.java index 90075bd..28ae33c 100644 --- a/src/com/maccasoft/tools/Preferences.java +++ b/src/com/maccasoft/tools/Preferences.java @@ -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; } diff --git a/src/com/maccasoft/tools/PreferencesDialog.java b/src/com/maccasoft/tools/PreferencesDialog.java index 601e471..a5ad65e 100644 --- a/src/com/maccasoft/tools/PreferencesDialog.java +++ b/src/com/maccasoft/tools/PreferencesDialog.java @@ -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()); diff --git a/src/com/maccasoft/tools/editor/SourceEditor.java b/src/com/maccasoft/tools/editor/SourceEditor.java index 63bb6ae..de28bf0 100644 --- a/src/com/maccasoft/tools/editor/SourceEditor.java +++ b/src/com/maccasoft/tools/editor/SourceEditor.java @@ -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(); redoStack = new Stack(); diff --git a/src/com/maccasoft/tools/internal/BusyIndicator.java b/src/com/maccasoft/tools/internal/BusyIndicator.java new file mode 100644 index 0000000..c81dc49 --- /dev/null +++ b/src/com/maccasoft/tools/internal/BusyIndicator.java @@ -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(); + } + + } + +}