1 package swt_jface.demo11;
2 import java.io.File;
3 import java.io.FileInputStream;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.lang.reflect.InvocationTargetException;
7 import org.eclipse.core.runtime.IProgressMonitor;
8 import org.eclipse.jface.action.Action;
9 import org.eclipse.jface.action.MenuManager;
10 import org.eclipse.jface.action.StatusLineManager;
11 import org.eclipse.jface.action.ToolBarManager;
12 import org.eclipse.jface.operation.IRunnableWithProgress;
13 import org.eclipse.jface.resource.ImageDescriptor;
14 import org.eclipse.jface.window.ApplicationWindow;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.Control;
18 import org.eclipse.swt.widgets.FileDialog;
19 import org.eclipse.swt.widgets.Shell;
20 import org.eclipse.swt.widgets.Text;
21 public class FileViewer extends ApplicationWindow {
22 Text text;
23 String content;
24 String lineDelimiter;
25
26 IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() {
27 public void run(IProgressMonitor monitor)
28 throws InvocationTargetException, InterruptedException {
29 System.out.println("Running from thread: " + Thread.currentThread().getName());
30 getShell().getDisplay().syncExec(new Runnable() {
31 public void run() {
32 content = text.getText();
33 lineDelimiter = text.getLineDelimiter();
34 }
35 });
36 monitor.beginTask("Counting total number of lines", content.length());
37 int lines = 1;
38 for(int i=0; i<content.length(); i++) {
39 if(monitor.isCanceled()) {
40 monitor.done();
41 System.out.println("Action cancelled");
42 return;
43 }
44 if(i + lineDelimiter.length() < content.length()) {
45 if(lineDelimiter.equals(content.substring(i, i+lineDelimiter.length()))) {
46 lines ++;
47 }
48 }
49 monitor.worked(1);
50 Thread.sleep(1);
51 }
52 monitor.done();
53 System.out.println("Total number of lines: " + lines);
54 }
55 };
56
57 Action actionCount = new Action("Count", ImageDescriptor.createFromFile(null, "C:/icons/run.gif")) {
58 public void run() {
59 try {
60 FileViewer.this.run(true, true, runnableWithProgress);
61 } catch (InvocationTargetException e) {
62 e.printStackTrace();
63 } catch (InterruptedException e) {
64 e.printStackTrace();
65 }
66 }
67 };
68 public FileViewer(Shell parentShell) {
69 super(parentShell);
70 addMenuBar();
71 addStatusLine();
72 addToolBar(SWT.FLAT);
73 }
74 protected Control createContents(Composite parent) {
75 getShell().setText("FileViewer v2.0");
76 setStatus("Ready");
77
78 text = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
79 text.setSize(300, 200);
80 return text;
81 }
82
83 Action actionOpenFile = new Action("Open", ImageDescriptor.createFromFile(null, "C:/icons/open.gif")) {
84 public void run() {
85 FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
86 final String file = dialog.open();
87 if(file != null) {
88 try {
89 String content = readFileAsAString(new File(file));
90 text.setText(content);
91 setStatus("File loaded successfully: " + file);
92 } catch (IOException e) {
93 e.printStackTrace();
94 setStatus("Failed to load file: " + file);
95 }
96 }
97 }
98 };
99 protected MenuManager createMenuManager() {
100 MenuManager menuManager = new MenuManager("");
101
102 MenuManager fileMenuManager = new MenuManager("&File");
103 fileMenuManager.add(actionOpenFile);
104
105 menuManager.add(fileMenuManager);
106
107 MenuManager toolsMenuManager = new MenuManager("&Tools");
108 toolsMenuManager.add(actionCount);
109 menuManager.add(toolsMenuManager);
110
111 return menuManager;
112 }
113 protected StatusLineManager createStatusLineManager() {
114 return super.createStatusLineManager();
115 }
116 protected ToolBarManager createToolBarManager(int style) {
117 ToolBarManager toolBarManager = new ToolBarManager(style);
118 toolBarManager.add(actionOpenFile);
119 toolBarManager.add(actionCount);
120 return toolBarManager;
121 }
122 public static void main(String[] args) {
123 ApplicationWindow viewer = new FileViewer(null);
124 viewer.setBlockOnOpen(true);
125 viewer.open();
126 }
127 public static String readFileAsAString(File file) throws IOException {
128 return new String(getBytesFromFile(file));
129 }
130 public static byte[] getBytesFromFile(File file) throws IOException {
131 InputStream is = new FileInputStream(file);
132 long length = file.length();
133 if (length > Integer.MAX_VALUE) {
134 throw new IllegalArgumentException("File is too large! (larger or equal to 2G)");
135 }
136 byte[] bytes = new byte[(int) length];
137 int offset = 0;
138 int numRead = 0;
139 while (offset < bytes.length
140 && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
141 offset += numRead;
142 }
143 if (offset < bytes.length) {
144 throw new IOException(
145 "Could not completely read file " + file.getName());
146 }
147 is.close();
148 return bytes;
149 }
150 }