App-Chart

 view release on metacpan or  search on metacpan

lib/App/Chart/Gtk2/RawDialog.pm  view on Meta::CPAN


  my $scrolled = $pagewidget;
  if ($pagewidget->isa ('Gtk2::VBox')) {
    ($scrolled) = $pagewidget->get_children;
    if ($datasheet->{'read_only'}) {
      $pagewidget->pack_start (Gtk2::Label->new(__('*** Read only ***')),
                               0,0,0);
    }
  }

  $pagewidget->{'dirty'} = 1;
  $pagewidget->{'datasheet'} = $datasheet;
  push @{$self->{'datasheets'}}, $datasheet;

  my $treeview = $scrolled->get_child;
  foreach my $column ($treeview->get_columns) {
    $column->set (resizable => 1);
    $column->set_sizing ('fixed');
  }
  $treeview->set_fixed_height_mode (1);

  $pagewidget->show_all;
  _refresh_page ($pagewidget);
}

sub _init_weblinks {
  my ($notebook, $scrolled, $pagenum) = @_;

  $scrolled->set (hscrollbar_policy => 'automatic');

  my $treeview = Gtk2::TreeView->new;
  $treeview->set (tooltip_column => 2);
  $treeview->signal_connect (row_activated => \&_do_weblink_row_activate);
  $treeview->signal_connect (button_press_event => \&_do_weblink_button_press);
  $scrolled->add ($treeview);

  my $store = $scrolled->{'weblinks_store'}
    = Gtk2::ListStore->new ('Glib::String', 'Glib::String', 'Glib::String');
  $treeview->set_model ($store);

  my $renderer = Gtk2::CellRendererText->new;
  $renderer->set (xalign => 0,
                  ypad => 0);
  $renderer->set_fixed_height_from_font (1);

  my $em = Gtk2::Ex::Units::em($treeview);
  {
    my $column = Gtk2::TreeViewColumn->new_with_attributes
      (__('Name'), $renderer, markup => 0);
    $column->set (sizing      => 'fixed',
                  fixed_width => 20*$em,
                  resizable   => 1);
    $treeview->append_column ($column);
  }
  {
    my $column = Gtk2::TreeViewColumn->new_with_attributes
      (__('URL'), $renderer, text => 1);
    $column->set (sizing      => 'fixed',
                  fixed_width => 60*$em,
                  resizable   => 1);
    $column->{'menu_func'} = \&_do_weblink_menu_popup;
    $treeview->append_column ($column);
  }
  $scrolled->show_all;
}
sub _do_weblink_row_activate {
  my ($treeview, $path, $column) = @_;
  my $url = _do_weblink_row_url ($treeview, $path);
  require App::Chart::Gtk2::GUI;
  App::Chart::Gtk2::GUI::browser_open ($url);
}
sub _do_weblink_row_url {
  my ($treeview, $path) = @_;
  my $store = $treeview->get_model;
  my $iter = $store->get_iter ($path);
  return $store->get_value ($iter, 1);
}
sub mnemonic_to_markup {
  my ($str) = @_;
  $str = Glib::Markup::escape_text($str);
  $str =~ s{_(.)}{$1 eq '_' ? '' : "<u>$1</u>"}eg;
  return $str;
}
# 'button-press-event' on the weblink TreeView
sub _do_weblink_button_press {
  my ($treeview, $event) = @_;
  my ($path, $column) = $treeview->get_path_at_pos ($event->x, $event->y);
  if (!$path) { return; }
  if (my $func = $column->{'menu_func'}) {
    $func->($treeview, $event, $path);
  }
  return Gtk2::EVENT_PROPAGATE;
}
sub _do_weblink_menu_popup {
  my ($treeview, $event, $path) = @_;
  my $menu = Gtk2::Menu->new;
  $menu->set_screen ($treeview->get_screen);
  my $url = _do_weblink_row_url ($treeview, $path);
  {
    my $item = Gtk2::ImageMenuItem->new_from_stock ('gtk-open');
    $item->{'url'} = $url;
    $item->signal_connect (activate => \&_do_weblink_menu_open);
    $menu->append ($item);
  }
  # LinkButton of Gtk 2.14 has a "Copy URL" message string (translated etc),
  # could show that
  {
    my $item = Gtk2::ImageMenuItem->new_from_stock ('gtk-copy');
    $item->{'url'} = $url;
    $item->signal_connect (activate => \&_do_weblink_menu_copy);
    $menu->append ($item);
  }
  $menu->show_all;
  $menu->popup (undef, undef, undef, undef,
                $event->button, $event->time);
}
sub _do_weblink_menu_open {
  my ($item) = @_;
  require App::Chart::Gtk2::GUI;
  App::Chart::Gtk2::GUI::browser_open ($item->{'url'});
}
sub _do_weblink_menu_copy {
  my ($item) = @_;
  my $clipboard = Gtk2::Clipboard->get_for_display
    ($item->get_display, Gtk2::Gdk::Atom->new('PRIMARY'));
  $clipboard->set_text ($item->{'url'});
}

sub set_symbol {
  my ($self, $symbol) = @_;
  if (! defined $symbol) { $symbol = ''; }
  if ($symbol eq $self->{'symbol'}) { return; }

  if ($symbol) {
    $self->set_title (__x('Chart: RawDialog: {symbol}',
                          symbol => $symbol));
  } else {
    $self->set_title (__('Chart: RawDialog'));
  }
  $self->{'symbol'} = $symbol;  # per default GET_PROPERTY
  $self->{'entry'}->set_text ($symbol);
  $self->refresh;
  $self->notify ('symbol');
}

sub SET_PROPERTY {
  my ($self, $pspec, $newval) = @_;
  my $pname = $pspec->get_name;
  if ($pspec->get_name eq 'symbol') {
    $self->set_symbol ($newval);
  } else {
    $self->{$pname} = $newval;   # per default GET_PROPERTY
  }
}

# 'notify::page' signal on the Gtk2::Notebook
sub _do_notebook_page {
  my ($notebook) = @_;
  my $self = $notebook->get_toplevel;
  my $pagenum = $notebook->get_current_page;
  my $pagewidget = $notebook->get_nth_page ($pagenum);

  $self->set_response_sensitive (RESPONSE_APPLY,  $pagewidget->{'datasheet'});
  $self->set_response_sensitive (RESPONSE_UNDO,   $pagewidget->{'datasheet'});
  $self->set_response_sensitive (RESPONSE_DELETE, $pagewidget->{'datasheet'});
  $self->set_response_sensitive (RESPONSE_INSERT, $pagewidget->{'insert_defaults'});

  _refresh_page ($self, $pagewidget);
}

sub _refresh_page {
  my ($self, $pagewidget) = @_;
  ### _refresh_page(): $pagewidget->{'dirty'}
  ### for: $self->{'symbol'}

lib/App/Chart/Gtk2/RawDialog.pm  view on Meta::CPAN

      $datasheet->insert ($defaults_func->($self, $pagewidget));
    }

  } elsif ($response eq RESPONSE_DELETE) {
    my $notebook = $self->{'notebook'};
    my $pagenum = $notebook->get_current_page;
    my $pagewidget = $notebook->get_nth_page ($pagenum);
    if (my $datasheet = $pagewidget->{'datasheet'}) {
      $datasheet->delete;
    }

  } elsif ($response eq RESPONSE_APPLY) {
    foreach my $datasheet (@{$self->{'datasheets'}}) {
      $datasheet->apply;
    }

  } elsif ($response eq RESPONSE_UNDO) {
    my $notebook = $self->{'notebook'};
    my $pagenum = $notebook->get_current_page;
    my $pagewidget = $notebook->get_nth_page ($pagenum);
    if (my $datasheet = $pagewidget->{'datasheet'}) {
      $datasheet->undo;
    }

  } elsif ($response eq 'close') {
    # as per a keyboard close, defaults to raising 'delete-event', which in
    # turn defaults to a destroy
    $self->signal_emit ('close');

  } elsif ($response eq 'help') {
    require App::Chart::Manual;
    App::Chart::Manual->open(__p('manual-node','Raw Data'), $self);
  }
}

# 'activate' signal on the Gtk2::Entry widget
sub _do_entry_activate {
  my ($entry) = @_;
  my $self = $entry->get_toplevel;
  $self->set_symbol ($entry->get_text);
}

# return true if $str is a valid ISO format date like 2008-05-27
sub validate_date {
  my ($str) = @_;
  return ($str =~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/);
}

# return true if $str is a valid number
sub validate_number {
  my ($str) = @_;
  return ($str =~ /^[0-9]*(.[0-9]*)?$/);
}

# return true if $str is a valid number
sub validate_integer {
  my ($str) = @_;
  return ($str =~ /^[0-9]*$/);
}

sub popup {
  my ($class, $symbol, $parent) = @_;
  if (! defined $symbol) { $symbol = ''; }
  require App::Chart::Gtk2::Ex::ToplevelBits;
  return App::Chart::Gtk2::Ex::ToplevelBits::popup
    ($class,
     properties => { symbol => $symbol },
     screen => $parent);
}

1;
__END__

=for stopwords RawDialog

=head1 NAME

App::Chart::Gtk2::RawDialog -- raw data display dialog

=head1 SYNOPSIS

 use App::Chart::Gtk2::RawDialog;
 App::Chart::Gtk2::RawDialog->popup();

=head1 WIDGET HIERARCHY

C<App::Chart::Gtk2::RawDialog> is a subclass of C<Gtk2::Dialog>.

    Gtk2::Widget
      Gtk2::Container
        Gtk2::Bin
          Gtk2::Window
            Gtk2::Dialog
              App::Chart::Gtk2::RawDialog

=head1 DESCRIPTION

A C<App::Chart::Gtk2::RawDialog> widget displays raw daily date, open, high, low,
etc from the database.

=head1 FUNCTIONS

=over 4

=item C<< App::Chart::Gtk2::RawDialog->new (key=>value,...) >>

Create and return a new RawDialog dialog widget.

=item C<< App::Chart::Gtk2::RawDialog->popup () >>

=item C<< App::Chart::Gtk2::RawDialog->popup ($symbol, $parent) >>

Create and open a C<RawDialog> dialog showing the data for C<$symbol>.
C<$symbol> can be omitted, or C<undef>, or the empty string, to display
nothing initially.

=back

=cut



( run in 1.555 second using v1.01-cache-2.11-cpan-364913b4093 )