############################################################################# ## Name: lib/Wx/DemoModules/wxRibbonControl.pm ## Purpose: wxPerl demo helper for Wx::Ribbon ## Author: Mark Dootson ## Modified by: ## Created: 03/03/2012 ## SVN-ID: $Id: wxRibbonControl.pm 3341 2012-09-14 09:18:34Z mdootson $ ## Copyright: (c) 2012 Mattia Barbon ## Licence: This program is free software; you can redistribute it and/or ## modify it under the same terms as Perl itself ############################################################################# # # based on the wxWidgets ribbon sample (C) Copyright 2009, Peter Cawley # # wrapped for wxWidgets ge 2.9.3 # ############################################################################# package Wx::DemoModules::wxRibbonControl; use strict; use Wx; use Wx::Ribbon; use Wx qw( :ribbon :ribbonart :sizer :id :misc :colour ); use base qw( Wx::Panel ); use Wx::Event qw( EVT_TOGGLEBUTTON EVT_MENU ); sub new { my $class = shift; my $self = $class->SUPER::new($_[0], -1); $self->{menuids} = { position_left_labels => Wx::NewId(), position_left_both => Wx::NewId(), position_top_icons => Wx::NewId(), position_top_both => Wx::NewId(), }; $self->{ribbonbar} = Wx::DemoModules::wxRibbonControl::RibbonBar->new($self); my $togglepanels = Wx::ToggleButton->new($self, wxID_ANY, "&Toggle panels"); $togglepanels->SetValue(1); $self->{togglepanels} = $togglepanels; EVT_TOGGLEBUTTON($self, $togglepanels, sub { shift->OnTogglePanels( @_ ) } ); EVT_MENU($self, $self->{menuids}->{position_left}, sub { shift->OnPositionLeftIcons( @_ ) } ); EVT_MENU($self, $self->{menuids}->{position_top}, sub { shift->OnPositionTopLabels( @_ ) } ); EVT_MENU($self, $self->{menuids}->{position_left_labels}, sub { shift->OnPositionLeftLabels( @_ ) } ); EVT_MENU($self, $self->{menuids}->{position_left_both}, sub { shift->OnPositionLeftBoth( @_ ) } ); EVT_MENU($self, $self->{menuids}->{position_top_icons}, sub { shift->OnPositionTopIcons( @_ ) } ); EVT_MENU($self, $self->{menuids}->{position_top_both}, sub { shift->OnPositionTopBoth( @_ ) } ); my $mainsizer = Wx::BoxSizer->new(wxVERTICAL); $mainsizer->Add($self->{ribbonbar}, 0, wxEXPAND); $mainsizer->Add($togglepanels, 0); $self->SetSizer($mainsizer); return $self; } sub add_to_tags { qw(controls new ) } sub title { 'wxRibbonControl' } sub SetBarStyle { my ($self, $style) = @_; my $ribbon = $self->{ribbonbar}; $ribbon->Freeze(); $ribbon->SetWindowStyleFlag($style); my $toolbar = $ribbon->{maintoolbar}; my $topsizer = $self->GetSizer; if($style & wxRIBBON_BAR_FLOW_VERTICAL) { $ribbon->SetTabCtrlMargins(10, 10); $topsizer->SetOrientation(wxHORIZONTAL); $toolbar->SetRows(3, 5) if $toolbar; } else { $ribbon->SetTabCtrlMargins(50, 20); $topsizer->SetOrientation(wxVERTICAL); $toolbar->SetRows(2, 3); } $ribbon->Realize(); $self->Layout(); $ribbon->Thaw(); $self->Refresh(); } sub OnHoveredColourChange { my ($self, $event) = @_; ## Set the background of the gallery to the hovered colour, or back to the ## default if there is no longer a hovered item. my $ribbon = $self->{ribbonbar}; my $gallery = $event->GetGallery; my $provider = $gallery->GetArtProvider(); if( my $gitem = $event->GetGalleryItem() ) { if( $provider == $ribbon->GetArtProvider() ) { $provider = $provider->Clone(); $gallery->SetArtProvider($provider); } my $clientdata = $ribbon->GetGalleryColour( $gallery, $gitem ); $provider->SetColour(wxRIBBON_ART_GALLERY_HOVER_BACKGROUND_COLOUR, $clientdata->{colour}); } else { if( $provider != $ribbon->GetArtProvider()) { $gallery->SetArtProvider( $ribbon->GetArtProvider() ); } } } sub OnPrimaryColourSelect { my ($self, $event) = @_; my $ribbon = $self->{ribbonbar}; my $clientdata = $ribbon->GetGalleryColour($event->GetGallery(), $event->GetGalleryItem()); Wx::LogMessage('Colour "%s" selected as primary', $clientdata->{name}); my( $primary, $secondary, $tertiary ) = $ribbon->GetArtProvider->GetColourScheme(); $ribbon->GetArtProvider->SetColourScheme( $clientdata->{colour}, $secondary, $tertiary ); $self->ResetGalleryArtProviders(); $ribbon->Refresh(); } sub OnSecondaryColourSelect { my ($self, $event) = @_; my $ribbon = $self->{ribbonbar}; my $clientdata = $ribbon->GetGalleryColour($event->GetGallery(), $event->GetGalleryItem()); Wx::LogMessage('Colour "%s" selected as secondary', $clientdata->{name}); my( $primary, $secondary, $tertiary ) = $ribbon->GetArtProvider->GetColourScheme(); $ribbon->GetArtProvider->SetColourScheme($primary, $clientdata->{colour}, $tertiary ); $self->ResetGalleryArtProviders(); $ribbon->Refresh(); } sub ResetGalleryArtProviders { my ( $self ) = @_; my $ribbon = $self->{ribbonbar}; my $primaryartprovider = $ribbon->{primary_gallery}->GetArtProvider(); my $secondaryartprovider = $ribbon->{secondary_gallery}->GetArtProvider(); if( $primaryartprovider != $ribbon->GetArtProvider()) { Wx::LogMessage('Resetting primary gallery art provider'); $ribbon->{primary_gallery}->SetArtProvider($ribbon->GetArtProvider()); } if( $secondaryartprovider != $ribbon->GetArtProvider()) { Wx::LogMessage('Resetting secondary gallery art provider'); $ribbon->{secondary_gallery}->SetArtProvider($ribbon->GetArtProvider()); } } sub OnSelectionExpandHButton { my ( $self, $event ) = @_; Wx::LogMessage('Expand selection horizontally button clicked.'); } sub OnSelectionExpandVButton { my ( $self, $event ) = @_; Wx::LogMessage('Expand selection vertically button clicked.'); } sub OnSelectionContractButton { my ( $self, $event ) = @_; Wx::LogMessage('Contract selection button clicked.'); } sub OnCircleButton { my ( $self, $event ) = @_; Wx::LogMessage('Circle button clicked.'); } sub OnCrossButton { my ( $self, $event ) = @_; Wx::LogMessage('Cross button clicked.'); } sub OnTriangleButton { my ( $self, $event ) = @_; Wx::LogMessage('Triangle button clicked.'); } sub OnSquareButton { my ( $self, $event ) = @_; Wx::LogMessage('Square button clicked.'); } sub OnTriangleDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append(wxID_ANY, "Equilateral"); $menu->Append(wxID_ANY, "Isosceles"); $menu->Append(wxID_ANY, "Scalene"); $event->PopupMenu($menu); } sub OnPolygonDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append(wxID_ANY, "Pentagon (5 sided)"); $menu->Append(wxID_ANY, "Hexagon (6 sided)"); $menu->Append(wxID_ANY, "Heptagon (7 sided)"); $menu->Append(wxID_ANY, "Octagon (8 sided)"); $menu->Append(wxID_ANY, "Nonagon (9 sided)"); $menu->Append(wxID_ANY, "Decagon (10 sided)"); $event->PopupMenu($menu); } sub OnNew { my ( $self, $event ) = @_; Wx::LogMessage('New button clicked.'); } sub OnNewDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append(wxID_ANY, "New Document"); $menu->Append(wxID_ANY, "New Template"); $menu->Append(wxID_ANY, "New Mail"); $event->PopupMenu($menu); } sub OnPrint { my ( $self, $event ) = @_; Wx::LogMessage('Print button clicked.'); } sub OnPrintDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append(wxID_ANY, "Print"); $menu->Append(wxID_ANY, "Preview"); $menu->Append(wxID_ANY, "Options"); $event->PopupMenu($menu); } sub OnRedoDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append(wxID_ANY, "Redo E"); $menu->Append(wxID_ANY, "Redo F"); $menu->Append(wxID_ANY, "Redo G"); $event->PopupMenu($menu); } sub OnUndoDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append(wxID_ANY, "Undo E"); $menu->Append(wxID_ANY, "Undo F"); $menu->Append(wxID_ANY, "Undo G"); $event->PopupMenu($menu); } sub OnPositionTopLabels { my ( $self, $event ) = @_; $self->SetBarStyle(wxRIBBON_BAR_DEFAULT_STYLE); } sub OnPositionTopIcons { my ( $self, $event ) = @_; my $style = wxRIBBON_BAR_SHOW_PAGE_ICONS | ( wxRIBBON_BAR_DEFAULT_STYLE() & ~wxRIBBON_BAR_SHOW_PAGE_LABELS ); $self->SetBarStyle( $style ); } sub OnPositionTopBoth { my ( $self, $event ) = @_; $self->SetBarStyle(wxRIBBON_BAR_DEFAULT_STYLE | wxRIBBON_BAR_SHOW_PAGE_ICONS); } sub OnPositionLeftLabels { my ( $self, $event ) = @_; $self->SetBarStyle(wxRIBBON_BAR_DEFAULT_STYLE | wxRIBBON_BAR_FLOW_VERTICAL); } sub OnPositionLeftIcons { my ( $self, $event ) = @_; $self->SetBarStyle((wxRIBBON_BAR_DEFAULT_STYLE() & ~wxRIBBON_BAR_SHOW_PAGE_LABELS) | wxRIBBON_BAR_SHOW_PAGE_ICONS | wxRIBBON_BAR_FLOW_VERTICAL); } sub OnPositionLeftBoth { my ( $self, $event ) = @_; $self->SetBarStyle(wxRIBBON_BAR_DEFAULT_STYLE | wxRIBBON_BAR_SHOW_PAGE_ICONS | wxRIBBON_BAR_FLOW_VERTICAL); } sub OnPositionTop { $_[0]->OnPositionTopLabels( $_[1] ) } sub OnPositionTopDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append($self->{menuids}->{position_top}, "Top with Labels"); $menu->Append($self->{menuids}->{position_top_icons}, "Top with Icons"); $menu->Append($self->{menuids}->{position_top_both}, "Top with Both"); $event->PopupMenu($menu); } sub OnPositionLeft { $_[0]->OnPositionLeftIcons( $_[1] ) } sub OnPositionLeftDropdown { my ( $self, $event ) = @_; my $menu = Wx::Menu->new(); $menu->Append($self->{menuids}->{position_left}, "Left with Icons"); $menu->Append($self->{menuids}->{position_left_labels}, "Left with Labels"); $menu->Append($self->{menuids}->{position_left_both}, "Left with Both"); $event->PopupMenu($menu); } sub OnTogglePanels { my ( $self, $event ) = @_; $self->{ribbonbar}->ShowPanels($self->{togglepanels}->GetValue()); } sub OnColourGalleryButton { my ( $self, $event ) = @_; my $gallery = $event->GetEventObject; return if !$gallery; my $ribbon = $self->{ribbonbar}; $ribbon->DismissExpandedPanel(); my $colourinfo; if( my $selection = $gallery->GetSelection() ) { $colourinfo = $ribbon->GetGalleryColour( $gallery, $selection ); } my $colourdata = Wx::ColourData->new; $colourdata->SetChooseFull( 1 ); $colourdata->SetColour( $colourinfo->{colour} ) if $colourinfo; my $dialog = Wx::ColourDialog->new( $self, $colourdata ); if( $dialog->ShowModal == wxID_OK ) { $colourdata = $dialog->GetColourData(); my $newcolour = $colourdata->GetColour(); ## Try to find colour in gallery my $item; for ( my $i = 0; $i < $gallery->GetCount; $i++ ) { $item = $gallery->GetItem($i); my $cinfo = $ribbon->GetGalleryColour($gallery, $item); if( $cinfo->{colour} == $newcolour ) { last; } else { $item = undef; } } ## Colour not in gallery - add it if( !$item ) { $item = $ribbon->AddColourToGallery($gallery, $newcolour->GetAsString(wxC2S_HTML_SYNTAX), $ribbon->{bitmapcreation_dc}, $newcolour); $gallery->Realize(); } ## Set selection $gallery->EnsureVisible($item); $gallery->SetSelection($item); ## Send an event to respond to the selection change my $dummy = Wx::RibbonGalleryEvent->new( wxEVT_COMMAND_RIBBONGALLERY_SELECTED, $gallery->GetId ); $dummy->SetEventObject($gallery); $dummy->SetGallery($gallery); $dummy->SetGalleryItem($item); $gallery->ProcessEvent($dummy); } $dialog->Destroy; } sub OnDefaultProvider { my ( $self, $event ) = @_; Wx::LogMessage('OnDefaultProvider Called'); $self->{ribbonbar}->DismissExpandedPanel(); $self->set_main_artprovider( Wx::RibbonDefaultArtProvider->new() ); } sub OnAUIProvider { my ( $self, $event ) = @_; Wx::LogMessage('OnAUIProvider Called'); $self->{ribbonbar}->DismissExpandedPanel(); $self->set_main_artprovider( Wx::RibbonAUIArtProvider->new() ); } sub OnMSWProvider { my ( $self, $event ) = @_; Wx::LogMessage('OnMSWProvider Called'); $self->{ribbonbar}->DismissExpandedPanel(); $self->set_main_artprovider( Wx::RibbonMSWArtProvider->new() ); } sub set_main_artprovider { my ( $self, $provider ) = @_; my $ribbon = $self->{ribbonbar}; #$ribbon->Freeze(); $ribbon->SetArtProvider( $provider->Clone ); $self->ResetGalleryArtProviders; my($primary, $secondary, $tertiary) = $provider->GetColourScheme(); $ribbon->PopulateColoursPanel($ribbon->{primary_panel}, $primary, $ribbon->{primary_id} ); $ribbon->PopulateColoursPanel($ribbon->{secondary_panel}, $secondary, $ribbon->{secondary_id} ); $ribbon->Realize(); #$ribbon->Thaw(); $self->GetSizer->Layout; $self->Refresh; } #------------------------------------------------------------------------------------- package Wx::DemoModules::wxRibbonControl::RibbonBar; #------------------------------------------------------------------------------------- use strict; use Wx::Ribbon; use Wx qw( :ribbon :ribbonart :id :bitmap :misc :combobox :sizer :font :pen :colour :brush); use base qw( Wx::RibbonBar ); use Wx::ArtProvider qw( :clientid :artid ); use Wx::Event qw( EVT_RIBBONBUTTONBAR_CLICKED EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED EVT_RIBBONGALLERY_HOVER_CHANGED EVT_RIBBONGALLERY_SELECTED EVT_RIBBONTOOLBAR_CLICKED EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED EVT_BUTTON EVT_TOGGLEBUTTON EVT_MENU ); sub new { my ($class, $parent) = @_; my $self = $class->SUPER::new($parent, wxID_ANY); $self->{bitmapcreation_dc} = Wx::MemoryDC->new; my $page = Wx::RibbonPage->new($self, wxID_ANY, 'Examples', _loadxpm('ribbon' ) ); my $tbpanel = Wx::RibbonPanel->new( $page, wxID_ANY, 'Toolbar', wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_NO_AUTO_MINIMISE); my $toolbar = Wx::RibbonToolBar->new($tbpanel, wxID_ANY); $self->{maintoolbar} = $toolbar; $toolbar->AddTool(wxID_ANY, _loadxpm( 'align_left' )); $toolbar->AddTool(wxID_ANY, _loadxpm( 'align_center' )); $toolbar->AddTool(wxID_ANY, _loadxpm( 'align_right' )); $toolbar->AddSeparator(); $toolbar->AddHybridTool(wxID_NEW, _ap_bmp(wxART_NEW, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddTool(wxID_ANY, _ap_bmp(wxART_FILE_OPEN, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddTool(wxID_ANY, _ap_bmp(wxART_FILE_SAVE, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddTool(wxID_ANY, _ap_bmp(wxART_FILE_SAVE_AS, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddSeparator(); $toolbar->AddDropdownTool(wxID_UNDO, _ap_bmp(wxART_UNDO, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddDropdownTool(wxID_REDO, _ap_bmp(wxART_REDO, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddSeparator(); $toolbar->AddTool(wxID_ANY, _ap_bmp(wxART_REPORT_VIEW, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddTool(wxID_ANY, _ap_bmp(wxART_LIST_VIEW, wxART_OTHER, Wx::Size->new(16, 15))); $toolbar->AddSeparator(); my $tool_position_left = $toolbar->AddHybridTool(wxID_ANY, _loadxpm( 'position_left_small' ), "Align ribbonbar vertically\non the left\nfor demonstration purposes"); my $tool_position_top = $toolbar->AddHybridTool(wxID_ANY, _loadxpm( 'position_top_small' ), "Align the ribbonbar horizontally\nat the top\nfor demonstration purposes"); $toolbar->AddSeparator(); $toolbar->AddHybridTool(wxID_PRINT, _ap_bmp(wxART_PRINT, wxART_OTHER, Wx::Size->new(16, 15)), "This is the Print button tooltip\ndemonstrating a tooltip"); $toolbar->SetRows(2, 3); my $selectionpanel = Wx::RibbonPanel->new($page, wxID_ANY, 'Selection', _loadxpm( 'selection_panel' )); my $selectionbar = Wx::RibbonButtonBar->new($selectionpanel); my $tool_selection_expand_v = $selectionbar->AddButton(wxID_ANY, 'Expand Vertically', _loadxpm( 'expand_selection_v' ), "This is a tooltip for Expand Vertically\ndemonstrating a tooltip"); my $tool_selection_expand_h = $selectionbar->AddButton(wxID_ANY, 'Expand Horizontally', _loadxpm( 'expand_selection_h' ), ''); my $tool_selection_contract = $selectionbar->AddButton(wxID_ANY, 'Contract', _loadxpm( 'auto_crop_selection' ), _loadxpm( 'auto_crop_selection_small' ) ); my $shapes_panel = Wx::RibbonPanel->new($page, wxID_ANY, 'Shapes', _loadxpm( 'circle_small' )); my $shapes = Wx::RibbonButtonBar->new($shapes_panel); my $tool_circle = $shapes->AddButton(wxID_ANY, 'Circle', _loadxpm( 'circle' ), _loadxpm( 'circle_small' ), wxNullBitmap, wxNullBitmap, wxRIBBON_BUTTON_NORMAL, "This is a tooltip for the circle button\ndemonstrating another tooltip"); my $tool_cross = $shapes->AddButton(wxID_ANY, 'Cross', _loadxpm( 'cross' ), ''); my $tool_triangle = $shapes->AddHybridButton(wxID_ANY, 'Triangle', _loadxpm( 'triangle' )); my $tool_square = $shapes->AddButton(wxID_ANY, 'Square', _loadxpm( 'square' ), ''); my $tool_polygon = $shapes->AddDropdownButton(wxID_ANY, 'Other Polygon', _loadxpm( 'hexagon' ), ''); my $sizer_panel = Wx::RibbonPanel->new($page, wxID_ANY, 'Panel with Sizer', wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE); my $sizer_panelcombo = Wx::ComboBox->new($sizer_panel, wxID_ANY, '', wxDefaultPosition, wxDefaultSize, [ 'Item 1 using a box sizer now', 'Item 2 using a box sizer now'], wxCB_READONLY); my $sizer_panelcombo2 = Wx::ComboBox->new($sizer_panel, wxID_ANY, '', wxDefaultPosition, wxDefaultSize, [ 'Item 1 using a box sizer now', 'Item 2 using a box sizer now'], wxCB_READONLY); $sizer_panelcombo->Select(0); $sizer_panelcombo2->Select(1); $sizer_panelcombo->SetMinSize(Wx::Size->new(150, -1)); $sizer_panelcombo2->SetMinSize(Wx::Size->new(150, -1)); my $sizer_panelsizer = Wx::BoxSizer->new(wxVERTICAL); $sizer_panelsizer->AddStretchSpacer(1); $sizer_panelsizer->Add($sizer_panelcombo, 0, wxALL|wxEXPAND, 2); $sizer_panelsizer->Add($sizer_panelcombo2, 0, wxALL|wxEXPAND, 2); $sizer_panelsizer->AddStretchSpacer(1); $sizer_panel->SetSizer($sizer_panelsizer); my $label_font = Wx::Font->new(8, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_LIGHT); $self->{bitmapcreation_dc}->SetFont($label_font); my $scheme = Wx::RibbonPage->new($self, wxID_ANY, 'Appearance', _loadxpm( 'eye' )); my ( $default_primary, $default_secondary, $default_tertiary ) = $self->GetArtProvider()->GetColourScheme(); my $provider_panel = Wx::RibbonPanel->new($scheme, wxID_ANY, 'Art', wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_NO_AUTO_MINIMISE); my $provider_bar = Wx::RibbonButtonBar->new($provider_panel, wxID_ANY); my $tool_default_provider = $provider_bar->AddButton(wxID_ANY, 'Default Provider', _ap_bmp(wxART_QUESTION, wxART_OTHER, Wx::Size->new(32, 32))); my $tool_aui_provider = $provider_bar->AddButton(wxID_ANY, 'AUI Provider', _loadxpm( 'aui_style' )); my $tool_msw_provider = $provider_bar->AddButton(wxID_ANY, 'MSW Provider', _loadxpm( 'msw_style' )); my $primary_panel = Wx::RibbonPanel->new($scheme, wxID_ANY, 'Primary Colour', _loadxpm( 'colours' )); my $id_primary_colour = Wx::NewId(); my $primary_gallery = $self->PopulateColoursPanel($primary_panel, $default_primary, $id_primary_colour); $self->{primary_gallery} = $primary_gallery; $self->{primary_panel} = $primary_panel; $self->{primary_id} = $id_primary_colour; my $secondary_panel = Wx::RibbonPanel->new($scheme, wxID_ANY, 'Secondary Colour', _loadxpm( 'colours' )); my $id_secondary_colour = Wx::NewId(); my $secondary_gallery = $self->PopulateColoursPanel($secondary_panel, $default_secondary, $id_secondary_colour); $self->{secondary_gallery} = $secondary_gallery; $self->{secondary_panel} = $secondary_panel; $self->{secondary_id} = $id_secondary_colour; Wx::RibbonPage->new($self, wxID_ANY, 'Empty Page', _loadxpm( 'empty' )); Wx::RibbonPage->new($self, wxID_ANY, 'Another Page', _loadxpm( 'empty' )); $self->Realize(); # connect events to parent panel EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_default_provider->GetId, sub { shift->OnDefaultProvider( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_aui_provider->GetId, sub { shift->OnAUIProvider( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_msw_provider->GetId, sub { shift->OnMSWProvider( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_selection_expand_h->GetId, sub { shift->OnSelectionExpandHButton( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_selection_expand_v->GetId, sub { shift->OnSelectionExpandVButton( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_selection_contract->GetId, sub { shift->OnSelectionContractButton( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_circle->GetId, sub { shift->OnCircleButton( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_cross->GetId, sub { shift->OnCrossButton( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_triangle->GetId, sub { shift->OnTriangleButton( @_ ) } ); EVT_RIBBONBUTTONBAR_CLICKED($parent, $tool_square->GetId, sub { shift->OnSquareButton( @_ ) } ); EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED($parent, $tool_triangle->GetId, sub { shift->OnTriangleDropdown( @_ ) } ); EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED($parent, $tool_polygon->GetId, sub { shift->OnPolygonDropdown( @_ ) } ); EVT_RIBBONGALLERY_HOVER_CHANGED($parent, $id_primary_colour, sub { shift->OnHoveredColourChange( @_ ) } ); EVT_RIBBONGALLERY_HOVER_CHANGED($parent, $id_secondary_colour, sub { shift->OnHoveredColourChange( @_ ) } ); EVT_RIBBONGALLERY_SELECTED($parent, $id_primary_colour, sub { shift->OnPrimaryColourSelect( @_ ) } ); EVT_RIBBONGALLERY_SELECTED($parent, $id_secondary_colour, sub { shift->OnSecondaryColourSelect( @_ ) } ); EVT_RIBBONTOOLBAR_CLICKED($parent, wxID_NEW, sub { shift->OnNew( @_ ) } ); EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED($parent, wxID_NEW, sub { shift->OnNewDropdown( @_ ) } ); EVT_RIBBONTOOLBAR_CLICKED($parent, wxID_PRINT, sub { shift->OnPrint( @_ ) } ); EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED($parent, wxID_PRINT, sub { shift->OnPrintDropdown( @_ ) } ); EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED($parent, wxID_REDO, sub { shift->OnRedoDropdown( @_ ) } ); EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED($parent, wxID_UNDO, sub { shift->OnUndoDropdown( @_ ) } ); EVT_RIBBONTOOLBAR_CLICKED($parent, $tool_position_left, sub { shift->OnPositionLeft( @_ ) } ); EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED($parent, $tool_position_left->GetId, sub { shift->OnPositionLeftDropdown( @_ ) } ); EVT_RIBBONTOOLBAR_CLICKED($parent, $tool_position_top->GetId, sub { shift->OnPositionTop( @_ ) } ); EVT_RIBBONTOOLBAR_DROPDOWN_CLICKED($parent, $tool_position_top->GetId, sub { shift->OnPositionTopDropdown( @_ ) } ); EVT_BUTTON($parent, $id_primary_colour, sub { shift->OnColourGalleryButton( @_ ) } ); EVT_BUTTON($parent, $id_primary_colour, sub { shift->OnColourGalleryButton( @_ ) } ); $parent->{menuids}->{position_left} = $tool_position_left->GetId; $parent->{menuids}->{position_top} = $tool_position_top->GetId; return $self; } sub _loadxpm { return Wx::Bitmap->new( Wx::Demo->get_data_file( qq(ribbon/$_[0].xpm) ), wxBITMAP_TYPE_XPM ); } sub _ap_bmp { Wx::ArtProvider::GetBitmap( @_ ); } sub PopulateColoursPanel { my( $self, $panel, $colour, $gallery_id) = @_; my $gallery = Wx::Window::FindWindowById($gallery_id); if($gallery) { $gallery->Clear(); } else { $gallery = Wx::RibbonGallery->new($panel, $gallery_id); } my $dc = $self->{bitmapcreation_dc}; my $def_item = $self->AddColourToGallery($gallery, 'Default', $dc, $colour); $gallery->SetSelection($def_item); $self->AddColourToGallery($gallery, 'BLUE', $dc); $self->AddColourToGallery($gallery, 'BLUE VIOLET', $dc); $self->AddColourToGallery($gallery, 'BROWN', $dc); $self->AddColourToGallery($gallery, 'CADET BLUE', $dc); $self->AddColourToGallery($gallery, 'CORAL', $dc); $self->AddColourToGallery($gallery, 'CYAN', $dc); $self->AddColourToGallery($gallery, 'DARK GREEN', $dc); $self->AddColourToGallery($gallery, 'DARK ORCHID', $dc); $self->AddColourToGallery($gallery, 'FIREBRICK', $dc); $self->AddColourToGallery($gallery, 'GOLD', $dc); $self->AddColourToGallery($gallery, 'GOLDENROD', $dc); $self->AddColourToGallery($gallery, 'GREEN', $dc); $self->AddColourToGallery($gallery, 'INDIAN RED', $dc); $self->AddColourToGallery($gallery, 'KHAKI', $dc); $self->AddColourToGallery($gallery, 'LIGHT BLUE', $dc); $self->AddColourToGallery($gallery, 'LIME GREEN', $dc); $self->AddColourToGallery($gallery, 'MAGENTA', $dc); $self->AddColourToGallery($gallery, 'MAROON', $dc); $self->AddColourToGallery($gallery, 'NAVY', $dc); $self->AddColourToGallery($gallery, 'ORANGE', $dc); $self->AddColourToGallery($gallery, 'ORCHID', $dc); $self->AddColourToGallery($gallery, 'PINK', $dc); $self->AddColourToGallery($gallery, 'PLUM', $dc); $self->AddColourToGallery($gallery, 'PURPLE', $dc); $self->AddColourToGallery($gallery, 'RED', $dc); $self->AddColourToGallery($gallery, 'SALMON', $dc); $self->AddColourToGallery($gallery, 'SEA GREEN', $dc); $self->AddColourToGallery($gallery, 'SIENNA', $dc); $self->AddColourToGallery($gallery, 'SKY BLUE', $dc); $self->AddColourToGallery($gallery, 'TAN', $dc); $self->AddColourToGallery($gallery, 'THISTLE', $dc); $self->AddColourToGallery($gallery, 'TURQUOISE', $dc); $self->AddColourToGallery($gallery, 'VIOLET', $dc); $self->AddColourToGallery($gallery, 'VIOLET RED', $dc); $self->AddColourToGallery($gallery, 'WHEAT', $dc); $self->AddColourToGallery($gallery, 'WHITE', $dc); $self->AddColourToGallery($gallery, 'YELLOW', $dc); return $gallery; } sub AddColourToGallery { my ($self, $gallery, $colourname, $dc, $colour) = @_; $colour ||= Wx::Colour->new($colourname); my $g_item; if($colour->IsOk) { my $iWidth = 64; my $iHeight = 40; my $bitmap = Wx::Bitmap->new($iWidth, $iHeight, -1); $dc->SelectObject($bitmap); my $brush = Wx::Brush->new($colour, wxSOLID); $dc->SetPen(wxBLACK_PEN); $dc->SetBrush($brush); $dc->DrawRectangle(0, 0, $iWidth, $iHeight); $colourname = lc($colourname); my ($text_x, $text_y, $text_descent, $text_externalLeading) = $dc->GetTextExtent($colourname); my $foreground = Wx::Colour->new(~$colour->Red(), ~$colour->Green(), ~$colour->Blue()); if(abs($foreground->Red() - $colour->Red()) + abs($foreground->Blue() - $colour->Blue()) + abs($foreground->Green() - $colour->Green()) < 64) { ## Foreground too similar to background - use a different ## strategy to find a contrasting colour $foreground = Wx::Colour->new(($colour->Red() + 64) % 256, 255 - $colour->Green(), ($colour->Blue() + 192) % 256); } $dc->SetTextForeground($foreground); $dc->DrawText($colourname, ($iWidth - $text_x + 1) / 2, ($iHeight - $text_y) / 2); $dc->SelectObjectAsSource(wxNullBitmap); $g_item = $gallery->Append($bitmap, wxID_ANY); $gallery->SetItemClientData($g_item, { name => $colourname, colour => $colour } ); } return $g_item; } sub GetGalleryColour { my( $self, $gallery, $item) = @_; my $data = $gallery->GetItemClientData($item); return $data; } # return 1 or 0 eval { return Wx::_wx_optmod_ribbon(); };