diff options
author | Mathias Gumz <akira@fluxbox.org> | 2015-01-15 13:24:46 (GMT) |
---|---|---|
committer | Mathias Gumz <akira@fluxbox.org> | 2015-01-15 13:25:05 (GMT) |
commit | 8387742c8860694777f7c2c62da0a90c9e836988 (patch) | |
tree | e5bd5a50c3e033ea73a9339474750287d06aeb3f /src/MenuCreator.cc | |
parent | b4cd45549013e8b45f95bf3e123cd14684948e91 (diff) | |
download | fluxbox-8387742c8860694777f7c2c62da0a90c9e836988.zip fluxbox-8387742c8860694777f7c2c62da0a90c9e836988.tar.bz2 |
Refactor menu code: be more explicit and compact
This commit is a preparation step for some menu cleanup ahead. To make it
easier to understand which types of MenuItems are added where and when, I
converted the overloaded FbTk::Menu::insert() functions into explicit ones
(Menu::insertSubmenu(), Menu::insertItem(), etc. ). This makes it possible
to just grep for 'insertSubmenu()'.
Side effect this commit: it trims down the very verbose creation of menu items
in regards to how the labels are created.
Minor: FbTk::Menu::shown and FbTk::Menu::s_focused are moved out of the class.
Diffstat (limited to 'src/MenuCreator.cc')
-rw-r--r-- | src/MenuCreator.cc | 188 |
1 files changed, 99 insertions, 89 deletions
diff --git a/src/MenuCreator.cc b/src/MenuCreator.cc index 41dcf73..b2b15f5 100644 --- a/src/MenuCreator.cc +++ b/src/MenuCreator.cc | |||
@@ -71,6 +71,60 @@ FbTk::StringConvertor s_stringconvertor(FbTk::StringConvertor::ToFbString); | |||
71 | list<string> s_encoding_stack; | 71 | list<string> s_encoding_stack; |
72 | list<size_t> s_stacksize_stack; | 72 | list<size_t> s_stacksize_stack; |
73 | 73 | ||
74 | |||
75 | |||
76 | enum { | ||
77 | L_SHADE = 0, | ||
78 | L_MAXIMIZE, | ||
79 | L_ICONIFY, | ||
80 | L_CLOSE, | ||
81 | L_KILL, | ||
82 | L_LOWER, | ||
83 | L_RAISE, | ||
84 | L_STICK, | ||
85 | L_TITLE, | ||
86 | L_SENDTO, | ||
87 | L_LAYER, | ||
88 | |||
89 | L_ALPHA, | ||
90 | |||
91 | L_MENU_EXIT, | ||
92 | L_MENU_ICONS, | ||
93 | }; | ||
94 | |||
95 | // returns 'label' if not empty, otherwise a (translated) default | ||
96 | // value based upon 'type' | ||
97 | const FbTk::FbString& _l(const FbTk::FbString& label, size_t type) { | ||
98 | |||
99 | _FB_USES_NLS; | ||
100 | static const FbTk::FbString _default_labels[] = { | ||
101 | _FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"), | ||
102 | _FB_XTEXT(Windowmenu, Maximize, "Maximize", "Maximize the window"), | ||
103 | _FB_XTEXT(Windowmenu, Iconify, "Iconify", "Iconify the window"), | ||
104 | _FB_XTEXT(Windowmenu, Close, "Close", "Close the window"), | ||
105 | _FB_XTEXT(Windowmenu, Kill, "Kill", "Kill the window"), | ||
106 | _FB_XTEXT(Windowmenu, Lower, "Lower", "Lower the window"), | ||
107 | _FB_XTEXT(Windowmenu, Raise, "Raise", "Raise the window"), | ||
108 | _FB_XTEXT(Windowmenu, Stick, "Stick", "Stick the window"), | ||
109 | _FB_XTEXT(Windowmenu, SetTitle, "Set Title", "Change the title of the window"), | ||
110 | _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"), | ||
111 | _FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"), | ||
112 | |||
113 | _FB_XTEXT(Configmenu, Transparency, "Transparency", "Menu containing various transparency options"), | ||
114 | |||
115 | _FB_XTEXT(Menu, Exit, "Exit", "Exit Command"), | ||
116 | _FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title"), | ||
117 | }; | ||
118 | |||
119 | if (label.empty()) { | ||
120 | return _default_labels[type]; | ||
121 | } | ||
122 | |||
123 | return label; | ||
124 | } | ||
125 | |||
126 | |||
127 | |||
74 | /** | 128 | /** |
75 | * Push the encoding onto the stack, and make it active. | 129 | * Push the encoding onto the stack, and make it active. |
76 | */ | 130 | */ |
@@ -169,7 +223,7 @@ void createStyleMenu(FbTk::Menu &parent, const string &label, | |||
169 | (style[style.length() - 1] != '~')) || | 223 | (style[style.length() - 1] != '~')) || |
170 | FbTk::FileUtil::isRegularFile((style + "/theme.cfg").c_str()) || | 224 | FbTk::FileUtil::isRegularFile((style + "/theme.cfg").c_str()) || |
171 | FbTk::FileUtil::isRegularFile((style + "/style.cfg").c_str())) | 225 | FbTk::FileUtil::isRegularFile((style + "/style.cfg").c_str())) |
172 | parent.insert(new StyleMenuItem(filelist[file_index], style)); | 226 | parent.insertItem(new StyleMenuItem(filelist[file_index], style)); |
173 | } | 227 | } |
174 | // update menu graphics | 228 | // update menu graphics |
175 | parent.updateMenu(); | 229 | parent.updateMenu(); |
@@ -208,7 +262,7 @@ void createRootCmdMenu(FbTk::Menu &parent, const string &label, | |||
208 | if ((FbTk::FileUtil::isRegularFile(rootcmd.c_str()) && | 262 | if ((FbTk::FileUtil::isRegularFile(rootcmd.c_str()) && |
209 | (filelist[file_index][0] != '.') && | 263 | (filelist[file_index][0] != '.') && |
210 | (rootcmd[rootcmd.length() - 1] != '~'))) | 264 | (rootcmd[rootcmd.length() - 1] != '~'))) |
211 | parent.insert(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd)); | 265 | parent.insertItem(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd)); |
212 | } | 266 | } |
213 | // update menu graphics | 267 | // update menu graphics |
214 | parent.updateMenu(); | 268 | parent.updateMenu(); |
@@ -289,29 +343,22 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem, | |||
289 | FbTk::Menu *submenu = MenuCreator::createMenuType("iconmenu", menu.screenNumber()); | 343 | FbTk::Menu *submenu = MenuCreator::createMenuType("iconmenu", menu.screenNumber()); |
290 | if (submenu == 0) | 344 | if (submenu == 0) |
291 | return; | 345 | return; |
292 | if (str_label.empty()) | 346 | menu.insertSubmenu(_l(str_label, L_MENU_ICONS), submenu); |
293 | menu.insert(_FB_XTEXT(Menu, Icons, "Icons", "Iconic windows menu title")); | ||
294 | else | ||
295 | menu.insert(str_label, submenu); | ||
296 | } else if (str_key == "exit") { // exit | 347 | } else if (str_key == "exit") { // exit |
297 | FbTk::RefCount<FbTk::Command<void> > exit_cmd(FbTk::CommandParser<void>::instance().parse("exit")); | 348 | FbTk::RefCount<FbTk::Command<void> > exit_cmd(FbTk::CommandParser<void>::instance().parse("exit")); |
298 | if (str_label.empty()) | 349 | menu.insertCommand(_l(str_label, L_MENU_EXIT), exit_cmd); |
299 | menu.insert(_FB_XTEXT(Menu, Exit, "Exit", "Exit Command"), exit_cmd); | ||
300 | else | ||
301 | menu.insert(str_label, exit_cmd); | ||
302 | } else if (str_key == "exec") { | 350 | } else if (str_key == "exec") { |
303 | // execute and hide menu | ||
304 | FbTk::RefCount<FbTk::Command<void> > exec_cmd(FbTk::CommandParser<void>::instance().parse("exec " + str_cmd)); | 351 | FbTk::RefCount<FbTk::Command<void> > exec_cmd(FbTk::CommandParser<void>::instance().parse("exec " + str_cmd)); |
305 | menu.insert(str_label, exec_cmd); | 352 | menu.insertCommand(str_label, exec_cmd); |
306 | } else if (str_key == "macrocmd") { | 353 | } else if (str_key == "macrocmd") { |
307 | FbTk::RefCount<FbTk::Command<void> > macro_cmd(FbTk::CommandParser<void>::instance().parse("macrocmd " + str_cmd)); | 354 | FbTk::RefCount<FbTk::Command<void> > macro_cmd(FbTk::CommandParser<void>::instance().parse("macrocmd " + str_cmd)); |
308 | menu.insert(str_label, macro_cmd); | 355 | menu.insertCommand(str_label, macro_cmd); |
309 | } else if (str_key == "style") { // style | 356 | } else if (str_key == "style") { |
310 | menu.insert(new StyleMenuItem(str_label, str_cmd)); | 357 | menu.insertItem(new StyleMenuItem(str_label, str_cmd)); |
311 | } else if (str_key == "config") { | 358 | } else if (str_key == "config") { |
312 | BScreen *screen = Fluxbox::instance()->findScreen(screen_number); | 359 | BScreen *screen = Fluxbox::instance()->findScreen(screen_number); |
313 | if (screen != 0) | 360 | if (screen != 0) |
314 | menu.insert(str_label, &screen->configMenu()); | 361 | menu.insertSubmenu(str_label, &screen->configMenu()); |
315 | } // end of config | 362 | } // end of config |
316 | else if (str_key == "include") { // include | 363 | else if (str_key == "include") { // include |
317 | 364 | ||
@@ -363,7 +410,7 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem, | |||
363 | 410 | ||
364 | parseMenu(parse, *submenu, labelconvertor, reloader); | 411 | parseMenu(parse, *submenu, labelconvertor, reloader); |
365 | submenu->updateMenu(); | 412 | submenu->updateMenu(); |
366 | menu.insert(str_label, submenu); | 413 | menu.insertSubmenu(str_label, submenu); |
367 | 414 | ||
368 | } // end of submenu | 415 | } // end of submenu |
369 | else if (str_key == "stylesdir" || str_key == "stylesmenu") { | 416 | else if (str_key == "stylesdir" || str_key == "stylesmenu") { |
@@ -383,10 +430,10 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem, | |||
383 | BScreen *screen = Fluxbox::instance()->findScreen(screen_number); | 430 | BScreen *screen = Fluxbox::instance()->findScreen(screen_number); |
384 | if (screen != 0) { | 431 | if (screen != 0) { |
385 | screen->workspaceMenu().setInternalMenu(); | 432 | screen->workspaceMenu().setInternalMenu(); |
386 | menu.insert(str_label, &screen->workspaceMenu()); | 433 | menu.insertSubmenu(str_label, &screen->workspaceMenu()); |
387 | } | 434 | } |
388 | } else if (str_key == "separator") { | 435 | } else if (str_key == "separator") { |
389 | menu.insert(new FbTk::MenuSeparator()); | 436 | menu.insertItem(new FbTk::MenuSeparator()); |
390 | } else if (str_key == "encoding") { | 437 | } else if (str_key == "encoding") { |
391 | startEncoding(str_cmd); | 438 | startEncoding(str_cmd); |
392 | } else if (str_key == "endencoding") { | 439 | } else if (str_key == "endencoding") { |
@@ -400,14 +447,14 @@ void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem, | |||
400 | // special NLS default labels | 447 | // special NLS default labels |
401 | if (str_label.empty()) { | 448 | if (str_label.empty()) { |
402 | if (str_key == "reconfig" || str_key == "reconfigure") { | 449 | if (str_key == "reconfig" || str_key == "reconfigure") { |
403 | menu.insert(_FB_XTEXT(Menu, Reconfigure, "Reload Config", "Reload all the configs"), command); | 450 | menu.insertCommand(_FB_XTEXT(Menu, Reconfigure, "Reload Config", "Reload all the configs"), command); |
404 | return; | 451 | return; |
405 | } else if (str_key == "restart") { | 452 | } else if (str_key == "restart") { |
406 | menu.insert(_FB_XTEXT(Menu, Restart, "Restart", "Restart Command"), command); | 453 | menu.insertCommand(_FB_XTEXT(Menu, Restart, "Restart", "Restart Command"), command); |
407 | return; | 454 | return; |
408 | } | 455 | } |
409 | } | 456 | } |
410 | menu.insert(str_label, command); | 457 | menu.insertCommand(str_label, command); |
411 | } | 458 | } |
412 | } | 459 | } |
413 | if (menu.numberOfItems() != 0) { | 460 | if (menu.numberOfItems() != 0) { |
@@ -498,122 +545,85 @@ bool MenuCreator::createWindowMenuItem(const string &type, | |||
498 | _FB_USES_NLS; | 545 | _FB_USES_NLS; |
499 | 546 | ||
500 | static MenuContext context; | 547 | static MenuContext context; |
548 | int screen = menu.screenNumber(); | ||
501 | 549 | ||
502 | if (type == "shade") { | 550 | if (type == "shade") { |
503 | static WindowMenuAccessor<bool> res(&FluxboxWindow::isShaded, &FluxboxWindow::setShaded, false); | 551 | static WindowMenuAccessor<bool> res(&FluxboxWindow::isShaded, &FluxboxWindow::setShaded, false); |
504 | menu.insert(new FbTk::BoolMenuItem( | 552 | menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_SHADE), res)); |
505 | label.empty()?_FB_XTEXT(Windowmenu, Shade, "Shade", "Shade the window"):label, | ||
506 | res)); | ||
507 | |||
508 | } else if (type == "maximize") { | 553 | } else if (type == "maximize") { |
509 | RefCmd maximize_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeFull)); | 554 | RefCmd maximize_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeFull)); |
510 | RefCmd maximize_vert_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeVertical)); | 555 | RefCmd maximize_vert_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeVertical)); |
511 | RefCmd maximize_horiz_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeHorizontal)); | 556 | RefCmd maximize_horiz_cmd(new WindowCmd<void>(&FluxboxWindow::maximizeHorizontal)); |
512 | FbTk::MultiButtonMenuItem *maximize_item = | 557 | FbTk::MultiButtonMenuItem *maximize_item = |
513 | new FbTk::MultiButtonMenuItem(3, | 558 | new FbTk::MultiButtonMenuItem(3, _l(label, L_MAXIMIZE)); |
514 | label.empty()? | ||
515 | _FB_XTEXT(Windowmenu, Maximize, | ||
516 | "Maximize", "Maximize the window"): | ||
517 | label); | ||
518 | // create maximize item with: | ||
519 | // button1: Maximize normal | ||
520 | // button2: Maximize Vertical | ||
521 | // button3: Maximize Horizontal | ||
522 | maximize_item->setCommand(1, maximize_cmd); | 559 | maximize_item->setCommand(1, maximize_cmd); |
523 | maximize_item->setCommand(2, maximize_vert_cmd); | 560 | maximize_item->setCommand(2, maximize_vert_cmd); |
524 | maximize_item->setCommand(3, maximize_horiz_cmd); | 561 | maximize_item->setCommand(3, maximize_horiz_cmd); |
525 | menu.insert(maximize_item); | 562 | menu.insertItem(maximize_item); |
526 | } else if (type == "iconify") { | 563 | } else if (type == "iconify") { |
527 | static WindowMenuAccessor<bool> res(&FluxboxWindow::isIconic, &FluxboxWindow::setIconic, false); | 564 | static WindowMenuAccessor<bool> res(&FluxboxWindow::isIconic, &FluxboxWindow::setIconic, false); |
528 | menu.insert(new FbTk::BoolMenuItem( | 565 | menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_ICONIFY), res)); |
529 | label.empty() ? | ||
530 | _FB_XTEXT(Windowmenu, Iconify, | ||
531 | "Iconify", "Iconify the window") : | ||
532 | label, res)); | ||
533 | } else if (type == "close") { | 566 | } else if (type == "close") { |
534 | RefCmd close_cmd(new WindowCmd<void>(&FluxboxWindow::close)); | 567 | RefCmd close_cmd(new WindowCmd<void>(&FluxboxWindow::close)); |
535 | menu.insert(label.empty() ? | 568 | menu.insertCommand(_l(label, L_CLOSE), close_cmd); |
536 | _FB_XTEXT(Windowmenu, Close, | ||
537 | "Close", "Close the window") : | ||
538 | label, close_cmd); | ||
539 | } else if (type == "kill" || type == "killwindow") { | 569 | } else if (type == "kill" || type == "killwindow") { |
540 | RefCmd kill_cmd(new WindowCmd<void>(&FluxboxWindow::kill)); | 570 | RefCmd kill_cmd(new WindowCmd<void>(&FluxboxWindow::kill)); |
541 | menu.insert(label.empty() ? | 571 | menu.insertCommand(_l(label, L_KILL), kill_cmd); |
542 | _FB_XTEXT(Windowmenu, Kill, | ||
543 | "Kill", "Kill the window"): | ||
544 | label, kill_cmd); | ||
545 | } else if (type == "lower") { | 572 | } else if (type == "lower") { |
546 | RefCmd lower_cmd(new WindowCmd<void>(&FluxboxWindow::lower)); | 573 | RefCmd lower_cmd(new WindowCmd<void>(&FluxboxWindow::lower)); |
547 | menu.insert( label.empty() ? | 574 | menu.insertCommand(_l(label, L_LOWER), lower_cmd); |
548 | _FB_XTEXT(Windowmenu, Lower, | ||
549 | "Lower", "Lower the window"): | ||
550 | label, lower_cmd); | ||
551 | } else if (type == "raise") { | 575 | } else if (type == "raise") { |
552 | RefCmd raise_cmd(new WindowCmd<void>(&FluxboxWindow::raise)); | 576 | RefCmd raise_cmd(new WindowCmd<void>(&FluxboxWindow::raise)); |
553 | menu.insert(label.empty() ? | 577 | menu.insertCommand(_l(label, L_RAISE), raise_cmd); |
554 | _FB_XTEXT(Windowmenu, Raise, | ||
555 | "Raise", "Raise the window"): | ||
556 | label, raise_cmd); | ||
557 | |||
558 | } else if (type == "stick") { | 578 | } else if (type == "stick") { |
559 | static WindowMenuAccessor<bool> res(&FluxboxWindow::isStuck, &FluxboxWindow::setStuck, false); | 579 | static WindowMenuAccessor<bool> res(&FluxboxWindow::isStuck, &FluxboxWindow::setStuck, false); |
560 | menu.insert(new FbTk::BoolMenuItem( | 580 | menu.insertItem(new FbTk::BoolMenuItem(_l(label, L_STICK), res)); |
561 | label.empty() ? | ||
562 | _FB_XTEXT(Windowmenu, Stick, | ||
563 | "Stick", "Stick the window"): | ||
564 | label, res)); | ||
565 | } else if (type == "settitledialog") { | 581 | } else if (type == "settitledialog") { |
566 | RefCmd setname_cmd(new SetTitleDialogCmd()); | 582 | RefCmd setname_cmd(new SetTitleDialogCmd()); |
567 | menu.insert(label.empty() ? | 583 | menu.insertCommand(_l(label, L_TITLE), setname_cmd); |
568 | _FB_XTEXT(Windowmenu, SetTitle, | ||
569 | "Set Title", "Change the title of the window"): | ||
570 | label, setname_cmd); | ||
571 | #ifdef HAVE_XRENDER | 584 | #ifdef HAVE_XRENDER |
572 | } else if (type == "alpha") { | 585 | } else if (type == "alpha") { |
573 | if (FbTk::Transparent::haveComposite() || | 586 | if (FbTk::Transparent::haveComposite() || |
574 | FbTk::Transparent::haveRender()) { | 587 | FbTk::Transparent::haveRender()) { |
575 | BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); | 588 | BScreen* s = Fluxbox::instance()->findScreen(screen); |
576 | if (screen == 0) | 589 | if (s == 0) |
577 | return false; | 590 | return false; |
578 | 591 | ||
579 | FbTk::Menu *submenu = | 592 | FbTk::Menu *submenu = |
580 | new AlphaMenu(screen->menuTheme(), | 593 | new AlphaMenu(s->menuTheme(), |
581 | screen->imageControl(), | 594 | s->imageControl(), |
582 | *screen->layerManager().getLayer(ResourceLayer::MENU)); | 595 | *(s->layerManager()).getLayer(ResourceLayer::MENU)); |
583 | submenu->disableTitle(); | 596 | submenu->disableTitle(); |
584 | menu.insert(label.empty() ? _FB_XTEXT(Configmenu, Transparency, "Transparency", | 597 | menu.insertSubmenu(_l(label, L_ALPHA), submenu); |
585 | "Menu containing various transparency options"): label, | ||
586 | submenu); | ||
587 | } | 598 | } |
588 | #endif // HAVE_XRENDER | 599 | #endif // HAVE_XRENDER |
589 | } else if (type == "extramenus") { | 600 | } else if (type == "extramenus") { |
590 | BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); | 601 | BScreen* s = Fluxbox::instance()->findScreen(screen); |
591 | BScreen::ExtraMenus::iterator it = screen->extraWindowMenus().begin(); | 602 | BScreen::ExtraMenus::iterator it = s->extraWindowMenus().begin(); |
592 | BScreen::ExtraMenus::iterator it_end = screen->extraWindowMenus().end(); | 603 | BScreen::ExtraMenus::iterator it_end = s->extraWindowMenus().end(); |
593 | for (; it != it_end; ++it) { | 604 | for (; it != it_end; ++it) { |
594 | it->second->disableTitle(); | 605 | it->second->disableTitle(); |
595 | menu.insert(it->first, it->second); | 606 | menu.insertSubmenu(it->first, it->second); |
596 | } | 607 | } |
597 | 608 | ||
598 | } else if (type == "sendto") { | 609 | } else if (type == "sendto") { |
599 | menu.insert(label.empty() ? _FB_XTEXT(Windowmenu, SendTo, "Send To...", "Send to menu item name"): | 610 | menu.insertSubmenu(_l(label, L_SENDTO), |
600 | label, new SendToMenu(*Fluxbox::instance()->findScreen(menu.screenNumber()))); | 611 | new SendToMenu(*Fluxbox::instance()->findScreen(screen))); |
601 | } else if (type == "layer") { | 612 | } else if (type == "layer") { |
602 | BScreen *screen = Fluxbox::instance()->findScreen(menu.screenNumber()); | 613 | BScreen* s = Fluxbox::instance()->findScreen(screen); |
603 | if (screen == 0) | 614 | if (s == 0) |
604 | return false; | 615 | return false; |
605 | 616 | ||
606 | FbTk::Menu *submenu = new LayerMenu(screen->menuTheme(), | 617 | FbTk::Menu *submenu = new LayerMenu(s->menuTheme(), |
607 | screen->imageControl(), | 618 | s->imageControl(), |
608 | *screen->layerManager().getLayer(ResourceLayer::MENU), | 619 | *(s->layerManager()).getLayer(ResourceLayer::MENU), |
609 | &context, | 620 | &context, |
610 | false); | 621 | false); |
611 | submenu->disableTitle(); | 622 | submenu->disableTitle(); |
612 | menu.insert(label.empty()?_FB_XTEXT(Windowmenu, Layer, "Layer ...", "Layer menu"):label, submenu); | 623 | menu.insertSubmenu(_l(label, L_LAYER), submenu); |
613 | |||
614 | 624 | ||
615 | } else if (type == "separator") { | 625 | } else if (type == "separator") { |
616 | menu.insert(new FbTk::MenuSeparator()); | 626 | menu.insertItem(new FbTk::MenuSeparator()); |
617 | } else | 627 | } else |
618 | return false; | 628 | return false; |
619 | 629 | ||