1/*
2 * Copyright (c) 1998-2007 Matthijs Hollemans
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 */
22
23#include "GrepApp.h"
24
25#include <stdio.h>
26
27#include <Entry.h>
28
29#include "GlobalDefs.h"
30#include "GrepWindow.h"
31#include "Model.h"
32
33
34GrepApp::GrepApp()
35	: BApplication(APP_SIGNATURE),
36	  fGotArgvOnStartup(false),
37	  fGotRefsOnStartup(false),
38	  fQuitter(NULL)
39{
40}
41
42
43GrepApp::~GrepApp()
44{
45	delete fQuitter;
46}
47
48
49void
50GrepApp::ArgvReceived(int32 argc, char** argv)
51{
52	fGotArgvOnStartup = true;
53
54	BMessage message(B_REFS_RECEIVED);
55	int32 refCount = 0;
56
57	for (int32 i = 1; i < argc; i++) {
58		BEntry entry(argv[i]);
59		entry_ref ref;
60		entry.GetRef(&ref);
61
62		if (entry.Exists()) {
63			message.AddRef("refs", &ref);
64			refCount += 1;
65		} else
66			printf("%s: File not found: %s\n", argv[0], argv[i]);
67	}
68
69	if (refCount > 0)
70		RefsReceived(&message);
71}
72
73
74void
75GrepApp::RefsReceived(BMessage* message)
76{
77	if (IsLaunching())
78		fGotRefsOnStartup = true;
79
80	new GrepWindow(message);
81}
82
83
84void
85GrepApp::ReadyToRun()
86{
87	if (!fGotArgvOnStartup && !fGotRefsOnStartup)
88		_NewUnfocusedGrepWindow();
89
90	// TODO: stippi: I don't understand what this is supposed to do:
91	if (fGotArgvOnStartup && !fGotRefsOnStartup)
92		PostMessage(B_QUIT_REQUESTED);
93}
94
95
96void
97GrepApp::MessageReceived(BMessage* message)
98{
99	switch (message->what) {
100		case B_SILENT_RELAUNCH:
101			_NewUnfocusedGrepWindow();
102			break;
103
104		case MSG_TRY_QUIT:
105			_TryQuit();
106			break;
107
108		default:
109			BApplication::MessageReceived(message);
110			break;
111	}
112}
113
114
115void
116GrepApp::_TryQuit()
117{
118	if (CountWindows() == 0)
119		PostMessage(B_QUIT_REQUESTED);
120
121	if (CountWindows() == 1 && fQuitter == NULL) {
122		fQuitter = new BMessageRunner(be_app_messenger,
123			new BMessage(MSG_TRY_QUIT), 200000, -1);
124	}
125}
126
127
128void
129GrepApp::_NewUnfocusedGrepWindow()
130{
131	BMessage emptyMessage;
132	new GrepWindow(&emptyMessage);
133}
134