haiku/src/prefs/keymap/KeymapWindow.cpp
shatty fc6c18530a changed iostreams to stdlib to fix linking problem under DEBUG=1
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4228 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-08-04 01:12:16 +00:00

354 lines
8.8 KiB
C++

#include <app/Application.h>
#include <interface/View.h>
#include <interface/GraphicsDefs.h>
#include <interface/MenuItem.h>
#include <interface/ListView.h>
#include <interface/ScrollView.h>
#include <interface/Button.h>
#include <interface/Alert.h>
#include <interface/Box.h>
#ifdef DEBUG
#include <stdio.h>
#endif //DEBUG
#include "KeymapWindow.h"
#include "KeymapListItem.h"
#include "KeymapApplication.h"
#include "messages.h"
KeymapWindow::KeymapWindow( BRect frame )
: BWindow( frame, WINDOW_TITLE, B_TITLED_WINDOW,
B_NOT_ZOOMABLE|B_NOT_RESIZABLE|B_ASYNCHRONOUS_CONTROLS )
{
rgb_color tempColor;
BRect bounds = Bounds();
BMenuBar *menubar;
fApplication = (KeymapApplication*) be_app;
fSelectedMap = fApplication->CurrentMap();
// Add the menu bar
menubar = AddMenuBar();
// The view to hold all but the menu bar
bounds.top = menubar->Bounds().bottom + 1;
fPlaceholderView = new BView( bounds, "placeholderView",
B_FOLLOW_NONE, 0 );
tempColor = ui_color( B_MENU_BACKGROUND_COLOR );
fPlaceholderView->SetViewColor( tempColor );
AddChild( fPlaceholderView );
// Create the Maps box and contents
AddMaps();
// The 'Use' button
bounds.Set( 527,200, 600,220 );
fUseButton = new BButton( bounds, "useButton", "Use",
new BMessage( USE_KEYMAP ));
fPlaceholderView->AddChild( fUseButton );
// The 'Revert' button
bounds.Set( 442,200, 515,220 );
fRevertButton = new BButton( bounds, "revertButton", "Revert",
new BMessage( REVERT ));
fPlaceholderView->AddChild( fRevertButton );
}
BMenuBar * KeymapWindow::AddMenuBar()
{
BRect bounds;
BMenu *menu;
BMenuItem *currentItem;
BMenuBar *menubar;
bounds = Bounds();
menubar = new BMenuBar( bounds, "menubar" );
AddChild( menubar );
// Create the File menu
menu = new BMenu( "File" );
menu->AddItem( new BMenuItem( "Open" B_UTF8_ELLIPSIS,
new BMessage( MENU_FILE_OPEN ), 'O' ) );
menu->AddSeparatorItem();
currentItem = new BMenuItem( "Save",
new BMessage( MENU_FILE_SAVE ), 'S' );
currentItem->SetEnabled( false );
menu->AddItem( currentItem );
menu->AddItem( new BMenuItem( "Save As" B_UTF8_ELLIPSIS,
new BMessage( MENU_FILE_SAVE_AS )));
menu->AddSeparatorItem();
menu->AddItem( new BMenuItem( "Quit",
new BMessage( B_QUIT_REQUESTED ), 'Q' ));
menubar->AddItem( menu );
// Create the Edit menu
menu = new BMenu( "Edit" );
currentItem = new BMenuItem( "Undo",
new BMessage( MENU_EDIT_UNDO ), 'Z' );
currentItem->SetEnabled( false );
menu->AddItem( currentItem );
menu->AddSeparatorItem();
menu->AddItem( new BMenuItem( "Cut",
new BMessage( MENU_EDIT_CUT ), 'X' ));
menu->AddItem( new BMenuItem( "Copy",
new BMessage( MENU_EDIT_COPY ), 'C' ));
menu->AddItem( new BMenuItem( "Paste",
new BMessage( MENU_EDIT_PASTE ), 'V' ));
menu->AddItem( new BMenuItem( "Clear",
new BMessage( MENU_EDIT_CLEAR )));
menu->AddSeparatorItem();
menu->AddItem( new BMenuItem( "Select All",
new BMessage( MENU_EDIT_SELECT_ALL ), 'A' ));
menubar->AddItem( menu );
// Create the Font menu
menu = new BMenu( "Font" );
menubar->AddItem( menu );
return menubar;
}
void KeymapWindow::AddMaps()
{
BBox *mapsBox;
BRect bounds;
BList *entryList;
BList *listItems;
KeymapListItem *currentKeymapItem;
// The Maps box
bounds = BRect( 9,11, 140, 227 );
mapsBox = new BBox( bounds );
mapsBox->SetLabel( "Maps" );
fPlaceholderView->AddChild( mapsBox );
/*
// Set drawing mode to B_OP_COPY
mapsBox->SetDrawingMode( B_OP_COPY );
// Set mapsBox->LowColor to background color
rgb_color tempColor;
tempColor = ui_color( B_MENU_BACKGROUND_COLOR );
mapsBox->SetLowColor( tempColor );
// Set mapsBox->HighColor to black
tempColor.red = 0;
tempColor.green = 0;
tempColor.blue = 0;
tempColor.alpha = 0;
mapsBox->SetHighColor( tempColor );
// Set font to something nice
BFont *font = new BFont();
font->SetFace( B_REGULAR_FACE );
// font->SetFamilyAndStyle();
font->SetRotation( 0.0 );
font->SetShear( 90.0 );
font->SetSize( 12.0 );
font->SetSpacing( B_BITMAP_SPACING );
mapsBox->SetFont( font );
*/
// The System list
bounds = BRect( 209,20, 370,135 );
/*
BView *textSystem = new BView( bounds, NULL, B_NOT_RESIZABLE, 0 );
rgb_color tempColor;
tempColor = ui_color( B_MENU_BACKGROUND_COLOR );
*/
/*
tempColor.red = 0;
tempColor.green = 0;
tempColor.blue = 0;
tempColor.alpha = 0;
*/
// textSystem->SetViewColor( tempColor );
// textSystem->SetLowColor( tempColor );
/*
tempColor.red = 0;
tempColor.green = 0;
tempColor.blue = 0;
tempColor.alpha = 0;
textSystem->SetHighColor( tempColor );
tempColor.red = 0;
tempColor.green = 0;
tempColor.blue = 0;
tempColor.alpha = 0;
textSystem->SetLowColor( tempColor );
textSystem->DrawString( "System", BPoint( 0, 14 ) );
fPlaceholderView->AddChild( textSystem );
*/
bounds = BRect( 13,36, 103,106 );
entryList = fApplication->SystemMaps();
fSystemListView = new BListView( bounds, "systemList" );
listItems = ListItemsFromEntryList( entryList );
fSystemListView->AddList( listItems );
mapsBox->AddChild( new BScrollView( "systemScrollList", fSystemListView,
B_FOLLOW_LEFT | B_FOLLOW_TOP, 0, false, true ));
fSystemListView->SetSelectionMessage( new BMessage( SYSTEM_MAP_SELECTED ));
delete listItems;
delete entryList;
// The User list
mapsBox->DrawString( "User", BPoint( 13, 113 ));
bounds = BRect( 13,129, 103,199 );
entryList = fApplication->UserMaps();
fUserListView = new BListView( bounds, "userList" );
// '(Current)'
currentKeymapItem = ItemFromEntry( fApplication->CurrentMap() );
if( currentKeymapItem != NULL )
fUserListView->AddItem( currentKeymapItem );
// Saved keymaps
listItems = ListItemsFromEntryList( entryList );
fUserListView->AddList( listItems );
mapsBox->AddChild( new BScrollView( "systemScrollList", fUserListView,
B_FOLLOW_LEFT | B_FOLLOW_TOP, 0, false, true ));
fUserListView->SetSelectionMessage( new BMessage( USER_MAP_SELECTED ));
delete listItems;
delete entryList;
}
BList* KeymapWindow::ListItemsFromEntryList( BList * entryList)
{
BEntry *currentEntry;
BList *listItems;
int nrItems;
#ifdef DEBUG
char name[B_FILE_NAME_LENGTH];
#endif //DEBUG
listItems = new BList();
nrItems = entryList->CountItems();
for( int index=0; index<nrItems; index++ ) {
currentEntry = (BEntry*)entryList->ItemAt( index );
listItems->AddItem( new KeymapListItem( currentEntry ));
#ifdef DEBUG
currentEntry->GetName( name );
printf("New list item: %s\n",name);
#endif //DEBUG
}
return listItems;
}
KeymapListItem* KeymapWindow::ItemFromEntry( BEntry *entry )
{
KeymapListItem *item;
if( entry->Exists() ) {
item = new KeymapListItem( entry );
item->SetText( "(Current)" );
}
else
item = NULL;
return item;
}
bool KeymapWindow::QuitRequested()
{
be_app->PostMessage( B_QUIT_REQUESTED );
return true;
}
void KeymapWindow::MessageReceived( BMessage* message )
{
switch( message->what ) {
case MENU_FILE_OPEN:
break;
case MENU_FILE_SAVE:
break;
case MENU_FILE_SAVE_AS:
break;
case MENU_EDIT_UNDO:
break;
case MENU_EDIT_CUT:
break;
case MENU_EDIT_COPY:
break;
case MENU_EDIT_PASTE:
break;
case MENU_EDIT_CLEAR:
break;
case MENU_EDIT_SELECT_ALL:
break;
case SYSTEM_MAP_SELECTED:
HandleSystemMapSelected( message );
break;
case USER_MAP_SELECTED:
HandleUserMapSelected( message );
break;
case USE_KEYMAP:
UseKeymap();
break;
case REVERT: // do nothing, just like the original
break;
default:
BWindow::MessageReceived( message );
break;
}
}
void KeymapWindow::HandleSystemMapSelected( BMessage *selectionMessage )
{
#if DEBUG
printf("System map selected\n");
#endif //DEBUG
HandleMapSelected( selectionMessage, fSystemListView, fUserListView );
}
void KeymapWindow::HandleUserMapSelected( BMessage *selectionMessage )
{
#if DEBUG
printf("User map selected\n");
#endif //DEBUG
HandleMapSelected( selectionMessage, fUserListView, fSystemListView );
}
void KeymapWindow::HandleMapSelected( BMessage *selectionMessage,
BListView * selectedView, BListView * otherView )
{
int32 index;
KeymapListItem *keymapListItem;
// Anything selected?
index = selectedView->CurrentSelection( 0 );
if( index < 0 ) {
#if DEBUG
printf("index<0; HandleMapSelected ends here.\n");
#endif //DEBUG
return;
}
// Store selected map in fSelectedMap
keymapListItem = (KeymapListItem*)selectedView->ItemAt( index );
if( keymapListItem == NULL )
return;
fSelectedMap = keymapListItem->KeymapEntry();
#if DEBUG
char name[B_FILE_NAME_LENGTH];
fSelectedMap->GetName( name );
printf("fSelectedMap has been set to %s\n",name);
#endif //DEBUG
// Deselect item in other BListView
otherView->DeselectAll();
}
void KeymapWindow::UseKeymap()
{
if( fSelectedMap != NULL )
fApplication->UseKeymap( fSelectedMap );
else {
// There is no keymap selected!
BAlert *alert;
alert = new BAlert( "w>noKeymap", "No keymap has been selected", "Bummer",
NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT );
alert->Go();
}
}