Files
haiku-beta6/src/apps/terminal/TerminalWindow.cpp
T
shatty 3b48bd6d4c patches for warnings
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8316 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-07-05 19:41:14 +00:00

422 lines
11 KiB
C++

#include <stdlib.h>
#include <Alert.h>
#include <Autolock.h>
#include <Clipboard.h>
#include <Debug.h>
#include <Dragger.h>
#include <File.h>
#include <FindDirectory.h>
#include <Menu.h>
#include <MenuItem.h>
#include <OS.h>
#include <Path.h>
#include <PrintJob.h>
#include <Roster.h>
#include <ScrollView.h>
#include <Shelf.h>
#include <StorageDefs.h>
#include <String.h>
#include <TextControl.h>
#include <TranslationUtils.h>
#include <Window.h>
#include <Constants.h>
#include <TerminalApp.h>
#include <TerminalWindow.h>
BRect terminalWindowBounds(0,0,560,390);
TerminalWindow::TerminalWindow(BMessage * settings)
: BWindow(terminalWindowBounds.OffsetBySelf(7,26),
"Terminal",B_DOCUMENT_WINDOW,0)
{
fInitStatus = B_ERROR;
int id = 1;
fInitStatus = InitWindow(id++);
Show();
}
TerminalWindow::~TerminalWindow()
{
delete fLogToFilePanel;
delete fWriteSelectionPanel;
delete fSaveAsSettingsFilePanel;
// if (fSaveMessage)
// delete fSaveMessage;
// if (fPrintSettings)
// delete fPrintSettings;
}
status_t
TerminalWindow::InitCheck(void)
{
return fInitStatus;
}
status_t
TerminalWindow::InitWindow(int32 id, entry_ref * settingsRef)
{
BView * view = new BView(Bounds(),"view",B_FOLLOW_ALL, B_FRAME_EVENTS|B_WILL_DRAW);
AddChild(view);
rgb_color white = {255,255,255,0};
view->SetViewColor(white);
// BShelf * shelf = new BShelf(view);
// status_t ignore = RestoreSettings(settingsRef);
RestoreSettings(settingsRef);
BString unTitled;
unTitled.SetTo("Terminal ");
unTitled << id;
SetTitle(unTitled.String());
// Add menubar
fMenuBar = new BMenuBar(BRect(0,0,0,0),"menubar");
AddChild(fMenuBar);
// Add shell view and scroll view
BRect shellFrame;
shellFrame.top = fMenuBar->Bounds().Height();
shellFrame.right = Bounds().Width() - B_V_SCROLL_BAR_WIDTH;
shellFrame.left = 0;
shellFrame.bottom = Bounds().Height();
fShellView = new BView(shellFrame,"shellview",B_FOLLOW_ALL, B_FRAME_EVENTS|B_WILL_DRAW);
rgb_color red = {170,80,80,0};
fShellView->SetViewColor(red);
if (BDragger::AreDraggersDrawn()) {
fShellView->ResizeBy(0,-8);
}
fScrollView = new BScrollView("scrollview", fShellView, B_FOLLOW_ALL,
B_FRAME_EVENTS|B_WILL_DRAW, false, true, B_NO_BORDER);
view->AddChild(fScrollView);
// add dragger view
BRect draggerFrame;
draggerFrame.top = shellFrame.bottom - 8;
draggerFrame.right = shellFrame.right;
draggerFrame.left = shellFrame.right - 7;
draggerFrame.bottom = Bounds().Height();
BDragger * dragger = new BDragger(draggerFrame,fScrollView,B_FOLLOW_RIGHT|B_FOLLOW_BOTTOM,B_FRAME_EVENTS|B_WILL_DRAW);
if (!BDragger::AreDraggersDrawn()) {
dragger->Hide();
}
view->AddChild(dragger);
// BRect blankFrame;
// blankFrame.top = shellFrame.bottom;
// blankFrame.right = draggerFrame.left;
// blankFrame.left = 0;
// blankFrame.bottom = draggerFrame.bottom;
// BView * blankView = new BView(blankFrame,"blankview",B_FOLLOW_ALL|B_WILL_DRAW,B_FRAME_EVENTS);
// view->AddChild(blankView);
fShellView->MakeFocus(true);
// Terminal menu
fTerminal = new BMenu("Terminal");
fMenuBar->AddItem(fTerminal);
fSwitchTerminals = new BMenuItem("Switch Terminals", new BMessage(TERMINAL_SWITCH_TERMINAL), 'G');
fTerminal->AddItem(fSwitchTerminals);
fSwitchTerminals->SetTrigger('T');
fStartNewTerminal = new BMenuItem("Start New Terminal", new BMessage(TERMINAL_START_NEW_TERMINAL), 'N');
fTerminal->AddItem(fStartNewTerminal);
fLogToFile = new BMenuItem("Log to File...", new BMessage(TERMINAL_LOG_TO_FILE));
fTerminal->AddItem(fLogToFile);
// Edit menu
fEdit = new BMenu("Edit");
fMenuBar->AddItem(fEdit);
fCopy = new BMenuItem("Copy", new BMessage(B_COPY), 'C');
fEdit->AddItem(fCopy);
fCopy->SetEnabled(false);
fPaste = new BMenuItem("Paste", new BMessage(B_PASTE), 'V');
fEdit->AddItem(fPaste);
fEdit->AddSeparatorItem();
fSelectAll = new BMenuItem("Select All", new BMessage(B_SELECT_ALL), 'A');
fEdit->AddItem(fSelectAll);
fWriteSelection = new BMenuItem("Write Selection...", new BMessage(EDIT_WRITE_SELECTION));
fEdit->AddItem(fWriteSelection);
fClearAll = new BMenuItem("Clear All", new BMessage(EDIT_CLEAR_ALL), 'L');
fEdit->AddItem(fClearAll);
fEdit->AddSeparatorItem();
fFind = new BMenuItem("Find...", new BMessage(EDIT_FIND),'F');
fEdit->AddItem(fFind);
fFindBackward = new BMenuItem("Find Backward",new BMessage(EDIT_FIND_BACKWARD),'[');
fEdit->AddItem(fFindBackward);
fFindForward = new BMenuItem("Find Forward", new BMessage(EDIT_FIND_FORWARD),']');
fEdit->AddItem(fFindForward);
// Settings menu
fSettings = new BMenu("Settings");
fMenuBar->AddItem(fSettings);
fWindowSize = new BMenu("Window Size");
fWindowSize->SetRadioMode(true);
fSettings->AddItem(fWindowSize);
BMenuItem * menuItem;
BMessage * itemMessage;
fWindowSize->AddItem(menuItem = new BMenuItem("80x24", itemMessage = new BMessage(SETTINGS_WINDOW_SIZE)));
itemMessage->AddInt32("columns", 80);
itemMessage->AddInt32("lines", 24);
menuItem->SetMarked(true);
fWindowSize->AddItem(menuItem = new BMenuItem("80x25", itemMessage = new BMessage(SETTINGS_WINDOW_SIZE)));
itemMessage->AddInt32("columns", 80);
itemMessage->AddInt32("lines", 25);
fWindowSize->AddItem(menuItem = new BMenuItem("80x40", itemMessage = new BMessage(SETTINGS_WINDOW_SIZE)));
itemMessage->AddInt32("columns", 80);
itemMessage->AddInt32("lines", 40);
fWindowSize->AddItem(menuItem = new BMenuItem("132x24", itemMessage = new BMessage(SETTINGS_WINDOW_SIZE)));
itemMessage->AddInt32("columns", 132);
itemMessage->AddInt32("lines", 24);
fWindowSize->AddItem(menuItem = new BMenuItem("132x25", itemMessage = new BMessage(SETTINGS_WINDOW_SIZE)));
itemMessage->AddInt32("columns", 132);
itemMessage->AddInt32("lines", 25);
// //Available fonts
// font_family plain_family;
// font_style plain_style;
// be_plain_font->GetFamilyAndStyle(&plain_family,&plain_style);
// fCurrentFontItem = 0;
//
// int32 numFamilies = count_font_families();
// for ( int32 i = 0; i < numFamilies; i++ ) {
// font_family localfamily;
// if ( get_font_family ( i, &localfamily ) == B_OK ) {
// subMenu=new BMenu(localfamily);
// subMenu->SetRadioMode(true);
// fFontMenu->AddItem(menuItem = new BMenuItem(subMenu, new BMessage(FONT_FAMILY)));
// if (!strcmp(plain_family,localfamily)) {
// menuItem->SetMarked(true);
// fCurrentFontItem = menuItem;
// }
// int32 numStyles=count_font_styles(localfamily);
// for(int32 j = 0;j<numStyles;j++){
// font_style style;
// uint32 flags;
// if( get_font_style(localfamily,j,&style,&flags)==B_OK){
// subMenu->AddItem(menuItem = new BMenuItem(style, new BMessage(FONT_STYLE)));
// if (!strcmp(plain_style,style)) {
// menuItem->SetMarked(true);
// }
// }
// }
// }
// }
// build file panels lazily
fLogToFilePanel = 0;
fWriteSelectionPanel = 0;
fSaveAsSettingsFilePanel = 0;
}
status_t
TerminalWindow::RestoreSettings(entry_ref * settingsRef)
{
status_t result = B_OK;
BFile settingsFile;
if (settingsRef != 0) {
result = settingsFile.SetTo(settingsRef,B_READ_ONLY);
if (result != B_OK) {
return result;
}
} else {
char settingsDirectory[B_PATH_NAME_LENGTH];
result = find_directory(B_USER_SETTINGS_DIRECTORY,0,true,
settingsDirectory,B_PATH_NAME_LENGTH);
if (result != B_OK) {
return result;
}
BPath settingsFilePath(settingsDirectory,"Terminal");
result = settingsFilePath.InitCheck();
if (result != B_OK) {
return result;
}
result = settingsFile.SetTo(settingsFilePath.Path(),B_READ_ONLY);
if (result != B_OK) {
return result;
}
}
// TODO : actually read the settings file
return B_OK;
}
void
TerminalWindow::MessageReceived(BMessage *message)
{
switch (message->what){
case TERMINAL_START_NEW_TERMINAL:
StartNewTerminal(message);
break;
case TERMINAL_SWITCH_TERMINAL:
SwitchTerminals(message);
break;
case ENABLE_ITEMS:
EnableEditItems(message);
break;
case DISABLE_ITEMS:
DisableEditItems(message);
break;
case B_COPY:
EditCopy(message);
break;
case B_PASTE:
EditPaste(message);
break;
case EDIT_CLEAR_ALL:
EditClearAll(message);
break;
// case FONT_SIZE:
// {
// float fontSize;
// message->FindFloat("size",&fontSize);
// SetFontSize(fontSize);
// }
// break;
// case FONT_FAMILY:
// {
// const char * fontFamily = 0, * fontStyle = 0;
// void * ptr;
// if (message->FindPointer("source",&ptr) == B_OK) {
// fCurrentFontItem = static_cast<BMenuItem*>(ptr);
// fontFamily = fCurrentFontItem->Label();
// }
// SetFontStyle(fontFamily, fontStyle);
// }
// break;
// case FONT_STYLE:
// {
// const char * fontFamily = 0, * fontStyle = 0;
// void * ptr;
// if (message->FindPointer("source",&ptr) == B_OK) {
// BMenuItem * item = static_cast<BMenuItem*>(ptr);
// fontStyle = item->Label();
// BMenu * menu = item->Menu();
// if (menu != 0) {
// fCurrentFontItem = menu->Superitem();
// if (fCurrentFontItem != 0) {
// fontFamily = fCurrentFontItem->Label();
// }
// }
// }
// SetFontStyle(fontFamily, fontStyle);
// }
// break;
default:
BWindow::MessageReceived(message);
break;
}
}
void
TerminalWindow::MenusBeginning()
{
}
void
TerminalWindow::Quit()
{
{
BAutolock lock(terminal_app);
terminal_app->Quit();
}
BWindow::Quit();
}
bool
TerminalWindow::QuitRequested()
{
return true;
}
void
TerminalWindow::StartNewTerminal(BMessage * message)
{
status_t result = be_roster->Launch(APP_SIGNATURE);
if (result != B_OK) {
// TODO: notify user
debugger("TerminalWindow::StartNewTerminal failed in Launch");
}
}
void
TerminalWindow::SwitchTerminals(BMessage * message)
{
status_t result;
thread_id id = find_thread(NULL);
thread_info info;
result = get_thread_info(id,&info);
if (result != B_OK) {
// TODO: notify user
debugger("TerminalWindow::SwitchTerminals failed in get_thread_info");
return;
}
BList teams;
be_roster->GetAppList(APP_SIGNATURE,&teams);
int32 index = teams.IndexOf((void*)info.team);
if (index < -1) {
// TODO: notify user
debugger("TerminalWindow::SwitchTerminals failed in IndexOf");
return;
}
do {
index = (index+teams.CountItems()-1)%teams.CountItems();
team_id next = (team_id)teams.ItemAt(index);
result = be_roster->ActivateApp(next);
} while (result != B_OK);
}
void
TerminalWindow::EnableEditItems(BMessage * message)
{
fCopy->SetEnabled(true);
}
void
TerminalWindow::DisableEditItems(BMessage * message)
{
fCopy->SetEnabled(false);
}
void
TerminalWindow::EditCopy(BMessage * message)
{
// fTextView->Copy(be_clipboard);
}
void
TerminalWindow::EditPaste(BMessage * message)
{
// fTextView->Paste(be_clipboard);
}
void
TerminalWindow::EditClearAll(BMessage * message)
{
// fTextView->SelectAll();
// fTextView->Clear();
}