# Copyright 2007, 2008, 2009, 2010, 2011 Kevin Ryde # This file is part of Chart. # # Chart is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation; either version 3, or (at your option) any later version. # # Chart is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # # You should have received a copy of the GNU General Public License along # with Chart. If not, see . package App::Chart::Gtk2::WatchlistSymbolMenu; use 5.010; use strict; use warnings; use Gtk2; use Locale::TextDomain ('App-Chart'); use App::Chart; use App::Chart::Gtk2::Symlist; use App::Chart::Gtk2::Ex::ToplevelBits; use Glib::Object::Subclass 'Gtk2::Menu', properties => [ Glib::ParamSpec->string ('symbol', __('Symbol'), 'Stock or commodity symbol string.', '', # default Glib::G_PARAM_READWRITE), Glib::ParamSpec->object ('symlist', 'symlist', 'The symlist the symbol is from.', 'App::Chart::Gtk2::Symlist', Glib::G_PARAM_READWRITE), ]; sub INIT_INSTANCE { my ($self) = @_; ### WatchlistSymbolMenu INIT_INSTANCE() { my $menu_title = $self->{'menu_title'} = Gtk2::Label->new ("X"); $menu_title->set_alignment (0.5, 0); # centre horizontally my $item = Gtk2::MenuItem->new; $item->add ($menu_title); $self->append ($item); } $self->append (Gtk2::SeparatorMenuItem->new); { my $item = Gtk2::ImageMenuItem->new_from_stock ('gtk-refresh'); $item->set_tooltip_text (__('Download a new quote for this symbol')); $item->signal_connect (activate => \&_do_refresh); $self->append ($item); } { my $item = Gtk2::MenuItem->new_with_mnemonic (__('_Chart')); $item->set_tooltip_text (__('Go to this symbol in the main Chart window')); $item->signal_connect (activate => \&_do_chart); $self->append ($item); } { my $item = $self->{'menu_intraday'} = Gtk2::MenuItem->new_with_mnemonic (__('_Intraday')); $item->set_tooltip_text (__('View intraday graphs for this symbol')); $item->signal_connect (activate => \&_do_intraday); $self->append ($item); } { my $item = Gtk2::MenuItem->new_with_mnemonic (__('_Web')); $self->append ($item); require App::Chart::Gtk2::WeblinkMenu; my $weblinkmenu = $self->{'weblinkmenu'} = App::Chart::Gtk2::WeblinkMenu->new; $item->set_submenu ($weblinkmenu); } $self->show_all; } sub SET_PROPERTY { my ($self, $pspec, $newval) = @_; my $pname = $pspec->get_name; $self->{$pname} = $newval; # per default GET_PROPERTY if ($pname eq 'symbol') { my $symbol = $newval; $self->{'menu_title'}->set_text ($symbol); $self->{'menu_intraday'}->set_sensitive (App::Chart::Gtk2::WatchlistDialog::symbol_intraday_sensitive($symbol)); $self->{'weblinkmenu'}->set (symbol => $symbol); } } # open the main chart display on the current symbol sub _do_chart { my ($menuitem) = @_; my $self = $menuitem->get_ancestor (__PACKAGE__); require App::Chart::Gtk2::Main; my $main = App::Chart::Gtk2::Main->find_for_dialog ($self->{'watchlist'}); $main->goto_symbol ($self->{'symbol'}, $self->{'symlist'}); $main->present; } sub _do_refresh { my ($menuitem) = @_; my $self = $menuitem->get_ancestor (__PACKAGE__); require App::Chart::Gtk2::Job::Latest; App::Chart::Gtk2::Job::Latest->start ([$self->{'symbol'}]); } sub _do_intraday { my ($menuitem) = @_; my $self = $menuitem->get_ancestor(__PACKAGE__) || return; ### WatchlistSymbolMenu intraday: $self->{'symbol'} App::Chart::Gtk2::Ex::ToplevelBits::popup ('App::Chart::Gtk2::IntradayDialog', properties => { symbol => $self->get('symbol') }, screen => $self); } sub popup_from_treeview { my ($class_or_self, $event, $treeview) = @_; my $self = ref $class_or_self ? $class_or_self : $class_or_self->new; my $watchlist = $treeview->get_toplevel; require Scalar::Util; Scalar::Util::weaken ($self->{'watchlist'} = $watchlist); my ($path) = $treeview->get_path_at_pos ($event->x, $event->y); if (! $path) { return; } my $model = $treeview->get_model; # App::Chart::Gtk2::WatchlistModel my $symlist = $model->get_symlist; my $iter = $symlist->get_iter ($path); my $symbol = $symlist->get_value ($iter, $model->COL_SYMBOL); $self->set (symbol => $symbol, symlist => $symlist); $self->set_screen ($treeview->get_screen); $self->popup (undef, undef, undef, undef, $event->button, $event->time); } 1; __END__ =for stopwords watchlist Watchlist WatchlistSymbolMenu Popup undef clickable symlist =head1 NAME App::Chart::Gtk2::WatchlistSymbolMenu -- menu for watchlist symbol =for test_synopsis my ($event, $treeview) =head1 SYNOPSIS use App::Chart::Gtk2::WatchlistSymbolMenu; App::Chart::Gtk2::WatchlistSymbolMenu->popup_from_treeview ($event, $treeview); =head1 WIDGET HIERARCHY C is a subclass of C, Gtk2::Widget Gtk2::Container Gtk2::MenuShell Gtk2::Menu App::Chart::Gtk2::WatchlistSymbolMenu =head1 DESCRIPTION A C shows the following things which can be done from a symbol in the Watchlist. It's split out from the main Watchlist code to keep the size there down and since it may not be needed at all if not used. +----------+ | | +----------+ | Chart | view the full chart | Refresh | get a new quote | Intraday | view an intraday graph | Web > | web links from App::Chart::Gtk2::WeblinkMenu +----------+ =head1 FUNCTIONS =over 4 =item C<< App::Chart::Gtk2::WatchlistSymbolMenu->new (key=>value,...) >> Create and return a new C object. Optional key/value pairs set initial properties as per C<< Glib::Object->new >>. =item C<< App::Chart::Gtk2::WatchlistSymbolMenu->popup_from_treeview ($event, $treeview) >> =item C<< $wsmenu->popup_from_treeview ($event, $treeview) >> Popup the given C<$wsmenu>, or as a class method create and popup a new menu, in both cases for the symbol under the mouse pointer in C<$treeview>. C<$event> should be a C giving the mouse position and the model in C<$treeview> is expected to be a C. =back =head1 PROPERTIES =over 4 =item C (C, default undef) The stock or commodity symbol string to be acted on by the menu. This is shown in a non-clickable entry in the menu. =item C (C object, default undef) The symlist the C is from. This is only used for the "Chart" menu item to give a symlist to the main view so Next/Prev will go from within that symlist. =back =head1 SEE ALSO L, L =cut