xref: /haiku/src/apps/text_search/GrepApp.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2  * Copyright (c) 1998-2007 Matthijs Hollemans
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 #include "GrepApp.h"
7 
8 #include <stdio.h>
9 
10 #include <Entry.h>
11 
12 #include "GlobalDefs.h"
13 #include "GrepWindow.h"
14 #include "Model.h"
15 
16 
17 GrepApp::GrepApp()
18 	: BApplication(APP_SIGNATURE),
19 	  fGotArgvOnStartup(false),
20 	  fGotRefsOnStartup(false),
21 	  fQuitter(NULL)
22 {
23 }
24 
25 
26 GrepApp::~GrepApp()
27 {
28 	delete fQuitter;
29 }
30 
31 
32 void
33 GrepApp::ArgvReceived(int32 argc, char** argv)
34 {
35 	fGotArgvOnStartup = true;
36 
37 	BMessage message(B_REFS_RECEIVED);
38 	int32 refCount = 0;
39 
40 	for (int32 i = 1; i < argc; i++) {
41 		BEntry entry(argv[i]);
42 		entry_ref ref;
43 		entry.GetRef(&ref);
44 
45 		if (entry.Exists()) {
46 			message.AddRef("refs", &ref);
47 			refCount += 1;
48 		} else
49 			printf("%s: File not found: %s\n", argv[0], argv[i]);
50 	}
51 
52 	if (refCount > 0)
53 		RefsReceived(&message);
54 }
55 
56 
57 void
58 GrepApp::RefsReceived(BMessage* message)
59 {
60 	if (IsLaunching())
61 		fGotRefsOnStartup = true;
62 
63 	new GrepWindow(message);
64 }
65 
66 
67 void
68 GrepApp::ReadyToRun()
69 {
70 	if (!fGotArgvOnStartup && !fGotRefsOnStartup)
71 		_NewUnfocusedGrepWindow();
72 
73 	// TODO: stippi: I don't understand what this is supposed to do:
74 	if (fGotArgvOnStartup && !fGotRefsOnStartup)
75 		PostMessage(B_QUIT_REQUESTED);
76 }
77 
78 
79 void
80 GrepApp::MessageReceived(BMessage* message)
81 {
82 	switch (message->what) {
83 		case B_SILENT_RELAUNCH:
84 			_NewUnfocusedGrepWindow();
85 			break;
86 
87 		case MSG_TRY_QUIT:
88 			_TryQuit();
89 			break;
90 
91 		default:
92 			BApplication::MessageReceived(message);
93 			break;
94 	}
95 }
96 
97 
98 void
99 GrepApp::_TryQuit()
100 {
101 	if (CountWindows() == 0)
102 		PostMessage(B_QUIT_REQUESTED);
103 
104 	if (CountWindows() == 1 && fQuitter == NULL) {
105 		fQuitter = new BMessageRunner(be_app_messenger,
106 			new BMessage(MSG_TRY_QUIT), 200000, -1);
107 	}
108 }
109 
110 
111 void
112 GrepApp::_NewUnfocusedGrepWindow()
113 {
114 	BMessage emptyMessage;
115 	new GrepWindow(&emptyMessage);
116 }
117