代码如下:
复制代码代码如下:
package swt_jface.demo11;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class FileViewer extends ApplicationWindow {
Text text;
String content;
String lineDelimiter;
IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
System.out.println("Running from thread: " + Thread.currentThread().getName());
getShell().getDisplay().syncExec(new Runnable() {
public void run() {
content = text.getText();
lineDelimiter = text.getLineDelimiter();
}
});
monitor.beginTask("Counting total number of lines", content.length());
int lines = 1;
for(int i=0; i if(monitor.isCanceled()) { monitor.done(); System.out.println("Action cancelled"); return; } if(i + lineDelimiter.length() < content.length()) { if(lineDelimiter.equals(content.substring(i, i+lineDelimiter.length()))) { lines ++; } } monitor.worked(1); Thread.sleep(1); } monitor.done(); System.out.println("Total number of lines: " + lines); } }; Action actionCount = new Action("Count", ImageDescriptor.createFromFile(null, "C:/icons/run.gif")) { public void run() { try { FileViewer.this.run(true, true, runnableWithProgress); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }; public FileViewer(Shell parentShell) { super(parentShell); addMenuBar(); addStatusLine(); addToolBar(SWT.FLAT); } protected Control createContents(Composite parent) { getShell().setText("FileViewer v2.0"); setStatus("Ready"); text = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); text.setSize(300, 200); return text; } Action actionOpenFile = new Action("Open", ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) { public void run() { FileDialog dialog = new FileDialog(getShell(), SWT.OPEN); final String file = dialog.open(); if(file != null) { try { String content = readFileAsAString(new File(file)); text.setText(content); setStatus("File loaded successfully: " + file); } catch (IOException e) { e.printStackTrace(); setStatus("Failed to load file: " + file); } } } }; protected MenuManager createMenuManager() { MenuManager menuManager = new MenuManager(""); MenuManager fileMenuManager = new MenuManager("&File"); fileMenuManager.add(actionOpenFile); menuManager.add(fileMenuManager); MenuManager toolsMenuManager = new MenuManager("&Tools"); toolsMenuManager.add(actionCount); menuManager.add(toolsMenuManager); return menuManager; } protected StatusLineManager createStatusLineManager() { return super.createStatusLineManager(); } protected ToolBarManager createToolBarManager(int style) { ToolBarManager toolBarManager = new ToolBarManager(style); toolBarManager.add(actionOpenFile); toolBarManager.add(actionCount); return toolBarManager; } public static void main(String[] args) { ApplicationWindow viewer = new FileViewer(null); viewer.setBlockOnOpen(true); viewer.open(); } public static String readFileAsAString(File file) throws IOException { return new String(getBytesFromFile(file)); } public static byte[] getBytesFromFile(File file) throws IOException { InputStream is = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { throw new IllegalArgumentException("File is too large! (larger or equal to 2G)"); } byte[] bytes = new byte[(int) length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException( "Could not completely read file " + file.getName()); } is.close(); return bytes; } }