Files
haiku-beta6/src/apps/stylededit/StyledEditApp.cpp
T
Ryan Leavengood b40c990627 Additional style fixes from Julun: adding back the virtual keyword, moving the
commas on class member initializers, fixing a typo. Thanks!


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22174 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-09-05 02:47:33 +00:00

280 lines
5.0 KiB
C++

/*
* Copyright 2002-2007, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Mattias Sundblad
* Andrew Bachmann
*/
#include "Constants.h"
#include "StyledEditApp.h"
#include "StyledEditWindow.h"
#include <Alert.h>
#include <Autolock.h>
#include <MenuBar.h>
#include <CharacterSet.h>
#include <CharacterSetRoster.h>
#include <FilePanel.h>
#include <MenuItem.h>
#include <Message.h>
#include <Path.h>
#include <Screen.h>
#include <stdio.h>
using namespace BPrivate;
StyledEditApp * styled_edit_app;
BRect gWindowRect(7-15, 26-15, 507, 426);
namespace
{
void
cascade()
{
BScreen screen(NULL);
BRect screenBorder = screen.Frame();
float left = gWindowRect.left + 15;
if (left + gWindowRect.Width() > screenBorder.right)
left = 7;
float top = gWindowRect.top + 15;
if (top + gWindowRect.Height() > screenBorder.bottom)
top = 26;
gWindowRect.OffsetTo(BPoint(left,top));
}
void
uncascade()
{
BScreen screen(NULL);
BRect screenBorder = screen.Frame();
float left = gWindowRect.left - 15;
if (left < 7) {
left = screenBorder.right - gWindowRect.Width() - 7;
left = left - ((int)left % 15) + 7;
}
float top = gWindowRect.top - 15;
if (top < 26) {
top = screenBorder.bottom - gWindowRect.Height() - 26;
top = top - ((int)left % 15) + 26;
}
gWindowRect.OffsetTo(BPoint(left,top));
}
}
// #pragma mark -
StyledEditApp::StyledEditApp()
: BApplication(APP_SIGNATURE),
fOpenPanel(NULL)
{
fOpenPanel = new BFilePanel();
BMenuBar *menuBar =
dynamic_cast<BMenuBar*>(fOpenPanel->Window()->FindView("MenuBar"));
fOpenAsEncoding = 0;
fOpenPanelEncodingMenu= new BMenu("Encoding");
menuBar->AddItem(fOpenPanelEncodingMenu);
fOpenPanelEncodingMenu->SetRadioMode(true);
BCharacterSetRoster roster;
BCharacterSet charset;
while (roster.GetNextCharacterSet(&charset) == B_NO_ERROR) {
BString name;
if (charset.GetFontID() == B_UNICODE_UTF8)
name = "Default";
else
name = charset.GetPrintName();
const char* mime = charset.GetMIMEName();
if (mime) {
name.Append(" (");
name.Append(mime);
name.Append(")");
}
BMenuItem* item = new BMenuItem(name.String(), new BMessage(OPEN_AS_ENCODING));
item->SetTarget(this);
fOpenPanelEncodingMenu->AddItem(item);
if (charset.GetFontID() == fOpenAsEncoding)
item->SetMarked(true);
}
fWindowCount = 0;
fNextUntitledWindow = 1;
styled_edit_app = this;
}
StyledEditApp::~StyledEditApp()
{
delete fOpenPanel;
}
void
StyledEditApp::DispatchMessage(BMessage *msg, BHandler *handler)
{
if (msg->what == B_ARGV_RECEIVED) {
int32 argc;
if (msg->FindInt32("argc", &argc) != B_OK)
argc = 0;
const char** argv = new const char*[argc];
for (int arg = 0; arg < argc; arg++) {
if (msg->FindString("argv", arg, &argv[arg]) != B_OK) {
argv[arg] = "";
}
}
const char* cwd;
if (msg->FindString("cwd", &cwd) != B_OK)
cwd = "";
ArgvReceivedEx(argc, argv, cwd);
} else
BApplication::DispatchMessage(msg, handler);
}
void
StyledEditApp::MessageReceived(BMessage *message)
{
switch (message->what) {
case MENU_NEW:
OpenDocument();
break;
case MENU_OPEN:
fOpenPanel->Show();
break;
case B_SILENT_RELAUNCH:
OpenDocument();
break;
case OPEN_AS_ENCODING:
void* ptr;
if (message->FindPointer("source", &ptr) == B_OK
&& fOpenPanelEncodingMenu != 0) {
fOpenAsEncoding = (uint32)fOpenPanelEncodingMenu->IndexOf((BMenuItem*)ptr);
}
break;
default:
BApplication::MessageReceived(message);
break;
}
}
void
StyledEditApp::OpenDocument()
{
cascade();
new StyledEditWindow(gWindowRect, fNextUntitledWindow++, fOpenAsEncoding);
fWindowCount++;
}
void
StyledEditApp::OpenDocument(entry_ref* ref)
{
cascade();
new StyledEditWindow(gWindowRect, ref, fOpenAsEncoding);
fWindowCount++;
}
void
StyledEditApp::CloseDocument()
{
uncascade();
fWindowCount--;
if (fWindowCount == 0) {
BAutolock lock(this);
Quit();
}
}
void
StyledEditApp::RefsReceived(BMessage *message)
{
int32 index = 0;
entry_ref ref;
while (message->FindRef("refs", index++, &ref) == B_OK) {
OpenDocument(&ref);
}
}
void
StyledEditApp::ArgvReceivedEx(int32 argc, const char* argv[], const char* cwd)
{
for (int i = 1 ; (i < argc) ; i++) {
BPath path;
if (argv[i][0] == '/')
path.SetTo(argv[i]);
else
path.SetTo(cwd, argv[i]);
if (path.InitCheck() != B_OK) {
fprintf(stderr, "Setting path failed: \"");
if (argv[i][0] == '/')
fprintf(stderr, "%s\".\n", argv[i]);
else
fprintf(stderr, "%s/%s\".\n", cwd, argv[i]);
continue;
}
entry_ref ref;
status_t status = get_ref_for_path(path.Path(), &ref);
if (status != B_OK) {
fprintf(stderr, "Could not open \"%s\": %s.\n", path.Path(), strerror(status));
continue;
}
OpenDocument(&ref);
}
}
void
StyledEditApp::ReadyToRun()
{
if (fWindowCount == 0)
OpenDocument();
}
int32
StyledEditApp::NumberOfWindows()
{
return fWindowCount;
}
// #pragma mark -
int
main(int argc, char** argv)
{
StyledEditApp styledEdit;
styledEdit.Run();
return 0;
}