1 package book.net.url;
2
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.browser.Browser;
5 import org.eclipse.swt.browser.CloseWindowListener;
6 import org.eclipse.swt.browser.LocationAdapter;
7 import org.eclipse.swt.browser.LocationEvent;
8 import org.eclipse.swt.browser.OpenWindowListener;
9 import org.eclipse.swt.browser.ProgressAdapter;
10 import org.eclipse.swt.browser.ProgressEvent;
11 import org.eclipse.swt.browser.StatusTextEvent;
12 import org.eclipse.swt.browser.StatusTextListener;
13 import org.eclipse.swt.browser.TitleEvent;
14 import org.eclipse.swt.browser.TitleListener;
15 import org.eclipse.swt.browser.WindowEvent;
16 import org.eclipse.swt.events.KeyAdapter;
17 import org.eclipse.swt.events.KeyEvent;
18 import org.eclipse.swt.events.KeyListener;
19 import org.eclipse.swt.events.MouseAdapter;
20 import org.eclipse.swt.events.MouseEvent;
21 import org.eclipse.swt.events.MouseListener;
22 import org.eclipse.swt.events.SelectionAdapter;
23 import org.eclipse.swt.events.SelectionEvent;
24 import org.eclipse.swt.events.SelectionListener;
25 import org.eclipse.swt.graphics.Image;
26 import org.eclipse.swt.layout.GridData;
27 import org.eclipse.swt.layout.GridLayout;
28 import org.eclipse.swt.widgets.Button;
29 import org.eclipse.swt.widgets.Composite;
30 import org.eclipse.swt.widgets.Display;
31 import org.eclipse.swt.widgets.Label;
32 import org.eclipse.swt.widgets.Menu;
33 import org.eclipse.swt.widgets.MenuItem;
34 import org.eclipse.swt.widgets.MessageBox;
35 import org.eclipse.swt.widgets.ProgressBar;
36 import org.eclipse.swt.widgets.Shell;
37 import org.eclipse.swt.widgets.TabFolder;
38 import org.eclipse.swt.widgets.TabItem;
39 import org.eclipse.swt.widgets.Text;
40
41 public class MyLiulanqi {
42
43 /*
44 * 浏览器设置参数
45 */
46 private static final String HOMEPAGE = "http://www.baidu.com";// 浏览器的首页
47 private static final String APP_TITLE = "汪某";
48 private static final String NEXT_LINE = System.getProperty("line.separator"); //换行符
49 private static int height = 600;
50 private static int width = 800;
51
52 private Shell shell = null;
53 private Display display = null;
54 private Button backButton = null; //后退按钮
55 private Button forwardButton = null;//前进按钮
56 private Button stopButton = null; //停止按钮
57 private Button refreshButton = null;//刷新按钮
58 private Button homepageButton = null;//回到主页按钮
59 private Text urlText = null; //地址输入栏按钮
60 private Button goButton = null; //转向按钮
61 private Text searchText = null; //搜索框
62 private Button searchButton = null; //搜索按钮
63
64 private ProgressBar progressBar = null; //进度条
65 private Label statusLabel = null; //最终网页打开过程显示
66 private Browser browser_default = null; //浏览器窗口
67 private TabFolder tabFolder = null; //browser的容器
68
69 private Composite composite_tool = null;;// 工具栏区域
70 private Composite composite_browser = null;;// 浏览窗口区域
71 private Composite composite_status = null;;// 状态栏区域
72
73 /*
74 * 浏览器的当前标签参数
75 */
76
77
78 private TabItem tabItem_now = null;//当前标
79 private Browser browser_now = null;//当前功能浏览器
80
81 /*
82 * 浏览器菜单栏的参数
83 */
84 private Menu mainMenu;
85 private MenuItem fileItem;
86 private Menu fileMenu;
87 private MenuItem viewItem;
88 private Menu viewMenu;
89 private MenuItem store_upItem;
90 private Menu store_upMenu;
91 private MenuItem toolItem;
92 private Menu toolMenu;
93 private MenuItem helpItem;
94 private Menu helpMenu;
95
96
97 private volatile String newUrl = null; // 最新输入的链接
98 private volatile boolean loadCompleted = false;//表示当前页面完全导入
99 private volatile boolean openNewItem = false;//表示新的页面在新窗口中打开
100
101 public static void main(String[] args) {
102 try {
103 MyLiulanqi window = new MyLiulanqi();
104 window.open();
105 } catch (Exception e) {
106 e.printStackTrace();
107 }
108 }
109 /*
110 * 一个SWT应用程序的基本组成部分为显示界面(Display)、
111 * 命令界面(Shell,使命令进入并使运行初始化)和窗口部件(Widgets)。
112 * Display负责管理事件循环和控制UI线程和其他线程之间的通讯。
113 * Shell是应用程序中被操作系统窗口管理器管理的窗口。
114 * 每个SWT应用程序至少需要一个Display和大于等于1个的Shell实例。
115 */
116
117 private void open() {
118 // TODO Auto-generated method stub
119 display = Display.getDefault();
120 shell = new Shell(display);
121 createContents();
122 shell.open();
123 shell.pack();//自动调整shell
124 while(!shell.isDisposed()) {
125 if (!display.readAndDispatch()) {
126 display.sleep();
127 }
128 }
129 display.dispose();
130 }
131
132 private void createContents() {
133 // TODO Auto-generated method stub
134
135
136 GridLayout gridLayout = new GridLayout();
137 gridLayout.marginWidth = 0;// 组件与容器边缘的水平距离
138 gridLayout.marginHeight = 0;// 组件与容器边缘的垂直距离
139 gridLayout.horizontalSpacing = 0;// 组件之间的水平距离
140 gridLayout.verticalSpacing = 0;// 组件之间的垂直距离
141 //设置浏览器图标,可以注释掉这一句
142 shell.setImage(new Image(Display.getCurrent(), System.getProperty("user.dir")
143 + "\\src\\book\\net\\url\\5.bmp"));
144 //shell.setBackground(new Color(Display.getDefault(),255,100,100)); //不知道如何设置背景参数,这里使用默认的背景颜色
145 shell.setLayout(gridLayout);
146 shell.setSize(height, width);
147 shell.setText(APP_TITLE);//设置主窗口标题
148 shell.setVisible(true);
149
150 /*
151 * 创建浏览器界面
152 */
153 createMenu(); //事件监听功能没有实现
154 createTool();
155 createBrowser();
156 createStatus();
157
158 /*
159 * 创建浏览器相关事件监听
160 * 很多监听功能还没有实现
161 */
162 runThread();
163 }
164
165 /**
166 * 创建菜单栏
167 */
168 private void createMenu() {
169 // TODO Auto-generated method stub
170 //GridData gridData = new GridData();;
171 //首先建立一个菜单栏,需要使用SWT.BAR属性。
172 mainMenu = new Menu(shell, SWT.BAR);
173 //在窗体中指定需要显示的菜单栏。
174 shell.setMenuBar(mainMenu);
175 //创建顶级菜单项,需要使用SWT.CASCADE 属性。
176 //创建文件菜单
177 fileItem=new MenuItem(mainMenu, SWT.CASCADE);
178 fileItem.setText("文件");
179 //创建与顶级菜单项相关的下拉式菜单
180 fileMenu=new Menu(shell, SWT.DROP_DOWN);
181 fileItem.setMenu(fileMenu);
182 {
183 //"新建"项
184 MenuItem newBrowserItem=new MenuItem(fileMenu, SWT.CASCADE);
185 newBrowserItem.setText("新建窗口");
186 newBrowserItem.addSelectionListener(new SelectionAdapter() {
187 @Override
188 //存在BUG,在第一个或者最后一个窗口关闭时,所有的都关闭
189 //各个窗口并不独立,双击标签栏也存在问题
190 public void widgetSelected(SelectionEvent e) {
191 // TODO Auto-generated method stub
192 open(); //存在bug
193 }
194
195 });
196 //"关闭"项
197 MenuItem closeCurrentBrowserItem = new MenuItem(fileMenu, SWT.CASCADE);
198 closeCurrentBrowserItem.setText("关闭窗口");
199 closeCurrentBrowserItem.addSelectionListener(new SelectionAdapter() {
200 @Override
201 public void widgetSelected(SelectionEvent e) {
202 // TODO Auto-generated method stub
203 shell.dispose();
204 }
205 });
206
207 //"注意"项
208 MenuItem attentionItem = new MenuItem(fileMenu, SWT.CASCADE);
209 attentionItem.setText("注意");
210 attentionItem.addSelectionListener(new SelectionAdapter() {
211
212 @Override
213 public void widgetSelected(SelectionEvent e) {
214 // TODO Auto-generated method stub
215 MessageBox attentionBox = new MessageBox(shell, SWT.OK);
216 {
217 attentionBox.setText("注意:");
218 attentionBox.setMessage("很多功能没有实现,比如:" + NEXT_LINE
219 + "1.本浏览器是基于IE用JAVA编写的" + NEXT_LINE
220 + "2.菜单栏的大部分功能,包括全选,查看,收藏夹相关,工具和选项功能" + NEXT_LINE
221 + "3.标签页的关闭和新建功能" + NEXT_LINE
222 + "4.地址栏的回写也常出现错误" + NEXT_LINE
223 + "5.地址栏和搜索栏的比例还不协调" + NEXT_LINE
224 + "6.搜索栏的默认搜索引擎是百度" + NEXT_LINE
225 + "7.急需改善,暂时还没能力");
226 attentionBox.open();
227 }
228 }
229
230 });
231 }
232
233 //创建查看菜单
234 viewItem = new MenuItem(mainMenu, SWT.CASCADE);
235 viewItem.setText("查看");
236 viewMenu = new Menu(shell, SWT.DROP_DOWN);
237 viewItem.setMenu(viewMenu);
238 {
239
240 MenuItem selectAllCurrentItem = new MenuItem(viewMenu, SWT.CASCADE);
241 selectAllCurrentItem.setText("全选");
242 selectAllCurrentItem.addSelectionListener(new SelectionAdapter() {
243
244 @Override
245 public void widgetSelected(SelectionEvent e) {
246 // TODO Auto-generated method stub
247 //statement
248 //没有实现
249 }
250 });
251 //statement
252 MenuItem findInCurrentItem = new MenuItem(viewMenu, SWT.CASCADE);
253 findInCurrentItem.setText("查找(在当前页)");
254 findInCurrentItem.addSelectionListener(new SelectionAdapter() {
255
256 @Override
257 public void widgetSelected(SelectionEvent e) {
258 // TODO Auto-generated method stub
259 //statement
260 //没有实现
261 }
262 });
263 }
264
265 //创建收藏菜单
266 store_upItem = new MenuItem(mainMenu, SWT.CASCADE);
267 store_upItem.setText("收藏");
268 store_upMenu= new Menu(shell, SWT.DROP_DOWN);
269 store_upItem.setMenu(store_upMenu);
270 {
271 //"收藏"项
272 MenuItem addToStoreUpBox = new MenuItem(store_upMenu, SWT.CASCADE);
273 addToStoreUpBox.setText("添加到收藏夹");
274 addToStoreUpBox.addSelectionListener(new SelectionAdapter() {
275 @Override
276 public void widgetSelected(SelectionEvent arg0) {
277 // TODO Auto-generated method stub
278 //statement
279 //没有实现
280 }
281 });
282 MenuItem organizeStoreUpBox = new MenuItem(store_upMenu, SWT.CASCADE);
283 organizeStoreUpBox.setText("整理收藏夹");
284 organizeStoreUpBox.addSelectionListener(new SelectionAdapter() {
285 @Override
286 public void widgetSelected(SelectionEvent e) {
287 // TODO Auto-generated method stub
288 //statement
289 //没有实现
290 }
291 });
292 }
293
294 //创建工具菜单
295 toolItem = new MenuItem(mainMenu, SWT.CASCADE);
296 toolItem.setText("工具");
297 toolMenu = new Menu(shell, SWT.DROP_DOWN);
298 toolItem.setMenu(toolMenu);
299 {
300 //"工具"项
301 MenuItem historyItem = new MenuItem(toolMenu, SWT.CASCADE);
302 historyItem.setText("工具");
303 //"选项"项
304 MenuItem choiceItem = new MenuItem(toolMenu, SWT.CASCADE);
305 choiceItem.setText("选项");
306 }
307
308 //创建帮助菜单栏
309 helpItem = new MenuItem(mainMenu, SWT.CASCADE);
310 helpItem.setText("关于");
311 helpMenu = new Menu(shell, SWT.DROP_DOWN);
312 helpItem.setMenu(helpMenu);
313 {
314 //"如何使用"项
315 MenuItem howToUseItem = new MenuItem(helpMenu, SWT.CASCADE);
316 howToUseItem.setText("如何使用");
317 howToUseItem.addSelectionListener(new SelectionAdapter() {
318 @Override
319 public void widgetSelected(SelectionEvent e) {
320 // TODO Auto-generated method stub
321 MessageBox messageBox = new MessageBox(shell, SWT.OK);
322 messageBox.setText("使用方法");
323 messageBox.setMessage(" 详情请百度\r\n http://www.baidu.com");
324 messageBox.open(); //没有这一句点击后将不会有反应
325 }
326
327 });
328 //"关于"项
329 MenuItem aboutItem = new MenuItem(helpMenu, SWT.CASCADE);
330 aboutItem.setText("关于" + APP_TITLE + "浏览器");
331 aboutItem.addSelectionListener(new SelectionAdapter() {
332 @Override
333 public void widgetSelected(SelectionEvent e) {
334 // TODO Auto-generated method stub
335
336 MessageBox messageBox = new MessageBox(shell, SWT.OK);
337 messageBox.setText("关于" + APP_TITLE + "浏览器");
338 messageBox.setMessage(" 汪某的浏览器");
339 messageBox.open();
340 }
341 });
342 }
343 }
344
345 /**
346 * 创建基本工具栏,不包括相关事件监听
347 */
348 private void createTool() {
349 // TODO Auto-generated method stub
350
351 composite_tool = new Composite(shell, SWT.BORDER);
352
353 // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
354 GridData gd_composite = new GridData(SWT.FILL, SWT.CENTER, true, false);
355 gd_composite.heightHint = 30;// 高度和宽度
356 gd_composite.widthHint = width;
357 composite_tool.setLayoutData(gd_composite);
358
359 GridLayout fl_composite = new GridLayout();
360 fl_composite.numColumns = 10; //共有back,forward,refresh,stop,home,urltext,go七个区域
361 composite_tool.setLayout(fl_composite);
362
363 backButton = new Button(composite_tool, SWT.BOTTOM);
364 forwardButton = new Button(composite_tool, SWT.BOTTOM);
365 stopButton = new Button(composite_tool, SWT.BOTTOM);
366 refreshButton = new Button(composite_tool, SWT.BOTTOM);
367 homepageButton = new Button(composite_tool, SWT.BOTTOM);
368 urlText = new Text(composite_tool, SWT.BORDER);
369 goButton = new Button(composite_tool, SWT.BOTTOM);
370 searchText = new Text(composite_tool, SWT.BORDER); //功能没有实现
371 searchButton = new Button(composite_tool, SWT.BOTTOM);
372
373
374 GridData gridData = new GridData();;
375 gridData.horizontalAlignment = SWT.FILL;
376 //gridDataBack.verticalAlignment = SWT.FILL;
377 backButton.setEnabled(true);
378 backButton.setText("后退");
379 backButton.setToolTipText("后退");
380 backButton.setLayoutData(gridData);
381
382 //gridDataForward.verticalAlignment = SWT.FILL;
383 forwardButton.setEnabled(true);
384 forwardButton.setText("前进");
385 forwardButton.setToolTipText("前进");
386 forwardButton.setLayoutData(gridData);
387
388 //gridDataRefresh.verticalAlignment =SWT.FILL;
389 refreshButton.setEnabled(true);
390 refreshButton.setText("刷新");
391 refreshButton.setToolTipText("刷新当前页面");
392 refreshButton.setLayoutData(gridData);
393
394 //gridDataStop.verticalAlignment = SWT.FILL;
395 stopButton.setEnabled(false);
396 stopButton.setText("停止");
397 stopButton.setToolTipText("停止加载页面");
398 stopButton.setLayoutData(gridData);
399
400 //gridDataHomepage.verticalAlignment = SWT.FILL;
401 homepageButton.setEnabled(true);
402 homepageButton.setText("主页");
403 homepageButton.setToolTipText("回到主页");
404 homepageButton.setLayoutData(gridData);
405
406 GridData gridDataUrlText = new GridData();
407 gridDataUrlText.horizontalAlignment = SWT.FILL;
408 gridDataUrlText.grabExcessHorizontalSpace = true;
409 urlText.setEditable(true);
410 urlText.setText(HOMEPAGE);
411 urlText.setToolTipText("请输入地址");
412 urlText.setLayoutData(gridDataUrlText);
413
414 goButton.setEnabled(true);
415 goButton.setText("GO");
416 goButton.setToolTipText("GO");
417 goButton.setLayoutData(gridData);
418
419 //搜索功能暂时还没有实现
420 GridData gridDataSearch = new GridData();
421 gridDataSearch.horizontalAlignment = SWT.FILL;
422 //是否水平抢占
423 //gridDataSearch.grabExcessHorizontalSpace = true;
424 searchText.setEditable(true);
425 searchText.setToolTipText("请输入要搜索的内容");
426 searchText.setLayoutData(gridDataSearch);
427
428 searchButton.setEnabled(true);
429 searchButton.setText("搜索");
430 searchButton.setToolTipText("搜索");
431 searchButton.setLayoutData(gridData);
432
433 }
434 /**
435 * 创建浏览器,不包括相关事件监听
436 */
437 private void createBrowser() {
438 // TODO Auto-generated method stub
439 composite_browser = new Composite(shell,SWT.BOTTOM);
440 // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
441 final GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, true);
442 gd_composite.heightHint = height - 60;// 高度和宽度
443 gd_composite.widthHint = width;
444 composite_browser.setLayoutData(gd_composite);
445
446 GridLayout gl_composite = new GridLayout();
447 gl_composite.marginHeight = 0;// 使组件上下方向占满容器
448 gl_composite.marginWidth = 0;// 使组件左右方向占满容器
449 composite_browser.setLayout(gl_composite);
450
451 tabFolder = new TabFolder(composite_browser, SWT.NONE);
452 final GridData gd_tabFolder = new GridData(SWT.FILL, SWT.FILL, true, true);
453 tabFolder.setLayoutData(gd_tabFolder);
454
455 /*
456 * 为标签添加右键功能
457 */
458
459
460 tabFolder.addMouseListener(new MouseListener() {
461
462 //实现双击关闭标签页功能
463 @Override
464 public void mouseDoubleClick(MouseEvent e) {
465 // TODO Auto-generated method stub
466 if(1 != tabFolder.getItemCount()) { //如果标签页个数不为1
467 browser_now.dispose();
468 tabItem_now.dispose();
469 tabFolder.redraw();
470 } else {
471 browser_now.setUrl("about:blank");
472 browser_now.setText("标签已经全部关闭!");
473 }
474 }
475
476 @Override
477 public void mouseDown(MouseEvent e) {
478
479 // TODO Auto-generated method stub
480 /*the button that was pressed or released;
481 * 1 for the first button, 左键
482 * 2 for the second button, 中键
483 * 3 for the third button, 右键
484 */
485 if (1 == e.button) {
486 //左键按下什么都不做
487 }
488
489 if (2 == e.button) {
490 //statement
491 //还没想好中键按下添加什么功能
492 }
493
494 if (3 == e.button) { //如果按下了右键
495 Menu menu_itemRightMouse = new Menu(shell,SWT.POP_UP);
496 tabFolder.setMenu(menu_itemRightMouse);
497
498 MenuItem createNewItem = new MenuItem(menu_itemRightMouse,SWT.NONE);
499 createNewItem.setText("新建标签页");
500 createNewItem.addSelectionListener(new SelectionAdapter() {
501
502 @Override
503 public void widgetSelected(SelectionEvent e) {
504 // TODO Auto-generated method stub
505 // statement
506 // 没有实现
507 //tempTabItem = new TabItem(tabFolder, SWT.NONE, 0);
508
509 }
510 });
511
512 MenuItem closeItemNow = new MenuItem(menu_itemRightMouse,SWT.NONE);
513 closeItemNow.setText("关闭当前标签页");
514 closeItemNow.addSelectionListener(new SelectionAdapter() {
515 @Override
516 public void widgetSelected(SelectionEvent e) {
517 // TODO Auto-generated method stub
518 if(1 != tabFolder.getItemCount()) { //如果不止一个标签页
519 browser_now.dispose();
520 tabItem_now.dispose();
521 tabFolder.redraw();
522 //没有重写地址栏
523 } else {
524 browser_now.setUrl("about:blank");
525 }
526 }
527 });
528
529 MenuItem closeItemAll = new MenuItem(menu_itemRightMouse,SWT.NONE);
530 closeItemAll.setText("关闭所有标签页");
531 closeItemAll.addSelectionListener(new SelectionAdapter() {
532 @Override
533 public void widgetSelected(SelectionEvent e) {
534 // TODO Auto-generated method stub
535 // statement
536 // 没有实现
537 }
538 });
539
540 MenuItem closeItemOthers= new MenuItem(menu_itemRightMouse,SWT.NONE);
541 closeItemOthers.setText("关闭其他标签页");
542 closeItemOthers.addSelectionListener(new SelectionAdapter() {
543 public void widgetSelected(SelectionEvent e) {
544 // TODO Auto-generated method stub
545 // statement
546 // 没有实现
547 }
548 });
549
550 }
551 }
552
553 @Override
554 public void mouseUp(MouseEvent e) {
555 // TODO Auto-generated method stub
556 // 还没想法实现什么功能
557 }
558
559 });
560
561 final TabItem tabItem_default = new TabItem(tabFolder, SWT.NONE);
562 browser_default = new Browser(tabFolder, SWT.NONE);
563 tabItem_default.setControl(browser_default);
564 browser_default.setUrl(HOMEPAGE);// 显示浏览器首页
565
566 /*
567 * 把初始化的标签置顶,选中
568 */
569 tabFolder.setSelection(tabItem_default);
570 }
571
572 /**
573 * 创建浏览器底部状态栏,不包括相关事件监听
574 */
575 private void createStatus() {
576 // TODO Auto-generated method stub
577 composite_status = new Composite(shell,SWT.BOTTOM);
578 // GridData()第一个参数是水平排列方式,第二个参数是垂直排列方式,第三个是水平抢占是否,第四个参数是垂直抢占是否
579 final GridData gd_composite = new GridData(SWT.FILL, SWT.FILL, true, false);
580 gd_composite.heightHint = 20;
581 gd_composite.widthHint = 300;
582 composite_status.setLayoutData(gd_composite);
583
584 GridLayout gl_composite = new GridLayout();
585 gl_composite.numColumns = 2;
586 gl_composite.marginBottom = 5;
587 composite_status.setLayout(gl_composite);
588
589 statusLabel = new Label(composite_status, SWT.NONE);
590 GridData gd_status = new GridData(SWT.FILL, SWT.CENTER, true, false);
591 gd_status.heightHint = 20;
592 gd_status.widthHint = width - 100;
593 statusLabel.setLayoutData(gd_status);
594
595 progressBar = new ProgressBar(composite_status, SWT.BORDER | SWT.SMOOTH);
596 progressBar.setLayoutData(new GridData());
597 progressBar.setVisible(false);// 打开过程初始不可见
598 }
599
600 /**
601 *创建各种监听事件
602 *很多还没有实现,Menu菜单栏,关闭标签页部分功能
603 */
604 private void runThread() {
605 // TODO Auto-generated method stub
606 /*
607 * 浏览器新标签前进、后退按钮的默认可用性为不可用
608 */
609 backButton.setEnabled(false);
610 forwardButton.setEnabled(false);
611
612 /*
613 * 获取浏览器的当前标签和功能Browser
614 */
615 tabItem_now = tabFolder.getItem(tabFolder.getSelectionIndex());
616 browser_now = (Browser) tabItem_now.getControl();
617
618 /*
619 * 选中事件发生时,修改当前浏览器标签
620 */
621 tabFolder.addSelectionListener(new SelectionAdapter() {
622
623 @Override
624 public void widgetSelected(SelectionEvent e) {
625 // TODO Auto-generated method stub
626 TabItem temp = (TabItem) e.item;
627 if (tabItem_now != temp) { //防止重选一个标签,预防多次触发相同事件
628 tabItem_now = temp;
629 browser_now=(Browser)tabItem_now.getControl();
630
631 /*
632 * 在相应的标签中,前进、后退按钮可用性是不一样的
633 */
634 if (browser_now.isBackEnabled()) {
635 backButton.setEnabled(true);
636 } else {
637 backButton.setEnabled(false);
638 }
639 if (browser_now.isForwardEnabled()) {
640 forwardButton.setEnabled(false);
641 } else {
642 forwardButton.setEnabled(true);
643 }
644 }
645 }
646 });
647 /*
648 * 添加浏览器的后退、向前、前进、停止按钮事件监听
649 */
650 backButton.addSelectionListener(new SelectionAdapter() {
651
652
653 @Override
654 public void widgetSelected(SelectionEvent e) {
655 // TODO Auto-generated method stub
656 if (browser_now.isBackEnabled()) {
657 browser_now.back();
658 forwardButton.setEnabled(true);
659 }
660 if (!browser_now.isBackEnabled()) {
661 backButton.setEnabled(false);
662 }
663 }
664 });
665
666
667 forwardButton.addSelectionListener(new SelectionAdapter() {
668
669 @Override
670 public void widgetSelected(SelectionEvent e) {
671 // TODO Auto-generated method stub
672 if (browser_now.isForwardEnabled()) {
673 browser_now.forward();
674 backButton.setEnabled(true);
675 }
676 if (browser_now.isForwardEnabled()) {
677 forwardButton.setEnabled(false); }
678 }
679 });
680
681 refreshButton.addSelectionListener(new SelectionAdapter() {
682
683 @Override
684 public void widgetSelected(SelectionEvent e) {
685 // TODO Auto-generated method stub
686 browser_now.refresh();
687 browser_now.setUrl(urlText.getText());
688 refreshButton.setEnabled(true);
689 }
690 });
691
692 stopButton.addSelectionListener(new SelectionAdapter() {
693
694 @Override
695 public void widgetSelected(SelectionEvent e) {
696 // TODO Auto-generated method stub
697 browser_now.stop();
698 }
699 });
700
701 homepageButton.addSelectionListener(new SelectionAdapter() {
702
703 @Override
704 public void widgetSelected(SelectionEvent e) {
705 // TODO Auto-generated method stub
706 browser_now.setUrl(HOMEPAGE);
707
708 }
709 });
710
711
712 //注册显示地址的文本框事件
713 urlText.addMouseListener(new MouseAdapter() {
714 @Override
715 public void mouseDoubleClick(MouseEvent e) {
716 // TODO Auto-generated method stub
717 urlText.selectAll(); //双击选中地址栏内容
718 }
719 @Override
720 public void mouseDown(MouseEvent e) {
721 // TODO Auto-generated method stub
722 // 还没想好实现什么功能
723 }
724 @Override
725 public void mouseUp(MouseEvent e) {
726 // TODO Auto-generated method stub
727 // 还没想好实现什么功能
728
729 }
730 });
731
732 urlText.addKeyListener(new KeyAdapter() {
733
734 @Override
735 public void keyPressed(KeyEvent e) {
736 // TODO Auto-generated method stub
737 if (SWT.CR == e.keyCode|| SWT.LF == e.keyCode) {
738 e.doit = false; //不再监听按键事件
739 //手动输入时,实现简单的地址栏判断功能
740 //这里判断url是否是以.com结尾,如果不是就添加.com,否则就直接打开
741 if(!urlText.getText().endsWith(".com")) {
742 String tempUrl = urlText.getText() + ".com";
743 browser_now.setUrl(tempUrl);
744 } else {
745 browser_now.setUrl(urlText.getText());
746 }
747 }
748 }
749 @Override
750 public void keyReleased(KeyEvent e) {
751 // TODO Auto-generated method stub
752 // 还没想好实现什么功能
753 }
754 });
755
756 searchText.addKeyListener(new KeyListener() {
757
758 @Override
759 public void keyPressed(KeyEvent e) {
760 // TODO Auto-generated method stub
761 if (SWT.CR == e.keyCode|| SWT.LF == e.keyCode) {
762 e.doit = false; //不再监听按键事件
763 //显示搜索结果
764 //wd关键字,ct=0表示搜索所有网页,
765 //0-所有语言,1-简体中文网页,2-繁体中文网页
766 browser_now.setUrl("http://www.baidu.com/s?wd=" + searchText.getText() + "&ct=0");
767 }
768 }
769
770
771 @Override
772 public void keyReleased(KeyEvent e) {
773 // TODO Auto-generated method stub
774
775 }
776
777 });
778
779 searchButton.addSelectionListener(new SelectionAdapter() {
780
781 @Override
782 public void widgetSelected(SelectionEvent e) {
783 // TODO Auto-generated method stub
784 browser_now.setUrl("http://www.baidu.com/s?wd=" + searchText.getText());
785 }
786
787 });
788
789
790 /*
791 * 1>在addOpenWindowListener()下的open()写入e.browser = browser_new情况下,导入新的超级链接,
792 * 只有当点击页面上的链接,且链接不在新的页面打开时才会发生.
793 * 2>在addOpenWindowListener()下的open()不写入e.browser = browser_new情况下,导入新的超级链接,
794 * 只有当点击页面上的链接,且链接在新的页面打开时才会发生.
795 * 除了以上两种外,当然还包括browser.back()、browser.forward()、browser.go()、browser.setUrl()发生时触发,
796 * 但changing()在不写入e.browser = browser_new情况下,不被browser.setUrl()触发
797 */
798
799 browser_now.addLocationListener(new LocationAdapter() {
800
801 @Override
802 public void changing(LocationEvent e) { // 表示超级链接地址改变了
803 // TODO Auto-generated method stub
804 urlText.setText(e.location);
805 if (!openNewItem) {//新的页面在同一标签中打开
806 backButton.setEnabled(true);//后退按钮可用,此句是后退按钮可用判定的逻辑开始点
807 }
808 }
809
810 @Override
811 public void changed(LocationEvent e) {
812 // TODO Auto-generated method stub
813 urlText.setText(e.location); //将地址写回到地址栏
814 /*
815 * 新的页面已经打开,browser的LocationListener已经监听完毕,openNewItem回复默认值
816 */
817 if(openNewItem) {
818 openNewItem = false;
819 }
820 }
821 });
822
823
824 goButton.addSelectionListener(new SelectionAdapter() {
825 @Override
826 public void widgetSelected(SelectionEvent e) {
827 // TODO Auto-generated method stub
828 browser_now.setUrl(urlText.getText());
829 }
830 });
831
832 /*
833 * 新的超级链接页面的导入的百分比,在导入新的页面时发生,此时链接地址已知
834 */
835 browser_now.addProgressListener(new ProgressAdapter() {
836 @Override
837 public void changed(ProgressEvent e) {//本事件不断发生于页面的导入过程中
838 progressBar.setMaximum(e.total);// e.total表示从最开始页面到最终页面的数值
839 progressBar.setSelection(e.current);
840 if (e.current != e.total) {//页面还没完全导入
841 loadCompleted = false;
842 goButton.setEnabled(false); //转向按钮不可用
843 stopButton.setEnabled(true);
844 progressBar.setVisible(true);// 页面的导入情况栏可见
845 } else {
846 loadCompleted = true;
847 goButton.setEnabled(true); //转向按钮可用
848 stopButton.setEnabled(false);
849 progressBar.setVisible(false);// 页面导入情况栏不可见
850 }
851 //System.out.println("progress_changed");//调试语句
852 }
853
854 @Override
855 public void completed(ProgressEvent e) {//发生在一次导入页面时,本监听器changed事件最后一次发生之前
856 //System.out.println("progress_completed");//调试语句
857 progressBar.setVisible(false);
858 }
859 });
860
861 /*
862 * 获取页面内容过程,文字显示addProgressListener()过程,同时还能检测到已打开页面的存在的超级链接,就是用给功能来获取
863 * 新的链接地址的
864 */
865 browser_now.addStatusTextListener(new StatusTextListener() {
866 public void changed(StatusTextEvent e) {
867 if (!loadCompleted) {
868 statusLabel.setText(e.text);
869 } else {
870 newUrl = e.text;//页面导入完成,捕捉页面上可能打开的链接
871 }
872 //System.out.println("statusText_changed");//调试语句
873 }
874 });
875
876 //为浏览器注册标题改变事件 ,改变浏览器顶部状态
877 browser_now.addTitleListener(new TitleListener() {
878 @Override
879 public void changed(TitleEvent e) {
880 // TODO Auto-generated method stub
881 if (!e.title.equals("about:blank")) { //如果标签栏全部关闭
882 shell.setText(APP_TITLE + "-" + e.title);
883 }
884 else {
885 shell.setText(APP_TITLE);
886 }
887 if (e.title.length() > 4) {//显示当前页面提示字符在标签上
888 tabItem_now.setText(e.title.substring(0, 4) + "..");
889 } else {
890 tabItem_now.setText(e.title);
891 }
892 tabItem_now.setToolTipText(e.title);
893 }
894 });
895 /*
896 * 打开新的页面,当前打开页面新的链接需要在新的窗口页面打开时发生.addOpenWindowListener下open()中的一句
897 * e.browser = browser_new;关键部分.联系addOpenWindowListener、addVisibilityWindowListener
898 * 和addDisposeListener的值传递枢纽
899 */
900 browser_now.addOpenWindowListener(new OpenWindowListener() {
901
902 @Override
903 public void open(WindowEvent e) {
904 // TODO Auto-generated method stub
905 Browser browser_new = new Browser(tabFolder, SWT.NONE);
906 TabItem tabItem_new = new TabItem(tabFolder, SWT.NONE);
907 tabItem_new.setControl(browser_new);
908 tabFolder.setSelection(tabItem_new);//新打开的页面标签置顶
909 tabFolder.redraw();//刷新容器
910 browser_new.setUrl(newUrl);//新标签中设置新的链接地址
911 openNewItem = true;//新的页面在新的标签中打开
912
913 /*
914 * 关键部分,告知新的页面由browser_new打开,只要实现这句就不会弹出操作系统默认的浏览器了
915 */
916 e.browser = browser_new;
917 /*
918 * 为浏览器新的标签添加事件监听
919 */
920 display.syncExec(new Runnable(){
921 public void run() {
922 runThread();
923 }
924 });
925 }
926 });
927
928 /*
929 * 浏览器关闭事件,关闭当前功能浏览器,不然的话浏览器主窗口关闭了,还有进程在运行
930 */
931 //CloseWindowListener中只有一个方法,就是close()方法
932 browser_now.addCloseWindowListener(new CloseWindowListener(){
933 public void close(WindowEvent e) {
934 browser_now.dispose();
935 }
936 });
937 }
938 }