+/*
+ Copyright (C) 2000-2003 Paul Davis
+ Written by Colin Law, CMT, Glasgow
+
+ This program 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 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id$
+*/
+
#include "imageframe_view.h"
#include "imageframe_time_axis.h"
#include "imageframe_time_axis_view.h"
#include "marker_view.h"
#include "editor.h"
#include "i18n.h"
+#include "canvas_impl.h"
+
#include <gtkmm2ext/gtk_ui.h>
#include <pbd/error.h>
#include "ardour_image_compositor_socket.h"
#include "public_editor.h"
+using namespace Gtk;
+using namespace PBD;
+
/* <CMT Additions file="editor.cc"> */
void
-Editor::add_imageframe_time_axis(std::string track_name, void* src)
+Editor::add_imageframe_time_axis(const string & track_name, void* src)
{
// check for duplicate name
if(get_named_time_axis(track_name))
}
// XXX should really put this somewhere safe
- std::string host_ip = "127.0.0.1" ;
+ const char * host_ip = "127.0.0.1" ;
- bool retcode = image_socket_listener->connect(host_ip,ardourvis::DEFAULT_PORT) ;
+ bool retcode = image_socket_listener->connect(host_ip, ardourvis::DEFAULT_PORT) ;
if(retcode == false)
{
void
Editor::scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item)
{
- jack_nframes_t offset = static_cast<jack_nframes_t>(frames_per_unit * (edit_hscroll_slider_width/2)) ;
-
- jack_nframes_t x_pos = 0 ;
- if(item->get_position() < offset)
- {
+ // GTK2FIX
+ //nframes_t offset = static_cast<nframes_t>(frames_per_unit * (edit_hscroll_slider_width/2)) ;
+ nframes_t offset = 0;
+
+ nframes_t x_pos = 0 ;
+
+ if (item->get_position() < offset) {
x_pos = 0 ;
- }
- else
- {
- x_pos = item->get_position() - offset + (item->get_duration() / 2) ;
+ } else {
+ x_pos = item->get_position() - offset + (item->get_duration() / 2);
}
- reposition_x_origin(x_pos) ;
+ reset_x_origin (x_pos);
}
void
-Editor::add_imageframe_marker_time_axis(std::string track_name, TimeAxisView* marked_track, void* src)
+Editor::add_imageframe_marker_time_axis(const string & track_name, TimeAxisView* marked_track, void* src)
{
// Can we only bind 2 data Items?
// @todo we really want to bind the src attribute too, for the moment tracks can only be added remotely,
}
void
-Editor::popup_imageframe_edit_menu(int button, int32_t time, GnomeCanvasItem* ifv, bool with_item)
+Editor::popup_imageframe_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_item)
{
ImageFrameTimeAxis* ifta = dynamic_cast<ImageFrameTimeAxis*>(clicked_trackview) ;
}
void
-Editor::popup_marker_time_axis_edit_menu(int button, int32_t time, GnomeCanvasItem* ifv, bool with_item)
+Editor::popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_item)
{
MarkerTimeAxis* mta = dynamic_cast<MarkerTimeAxis*>(clicked_trackview) ;
}
TimeAxisView*
-Editor::get_named_time_axis(std::string name)
+Editor::get_named_time_axis(const string & name)
{
TimeAxisView* tav = 0 ;
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i)
+ for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i)
{
if (((TimeAxisView*)*i)->name() == name)
{
/* <CMT Additions file="editor_canvas_events.cc"> */
-
-/**
- * ---------------------------------------------------------------------------------------------------
- * Static event handlers
- * These handlers deal with events from the GnomeCanvas, a c-based component
- */
-
-
-gint
-Editor::_canvas_imageframe_start_handle_event(GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- ImageFrameView* ifv = (ImageFrameView*) data ;
- Editor* editor = dynamic_cast<Editor*> (&ifv->get_time_axis_view().editor);
- return editor->canvas_imageframe_start_handle_event(item,event,ifv);
-}
-
-gint
-Editor::_canvas_imageframe_end_handle_event(GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- ImageFrameView* ifv = (ImageFrameView*) data ;
- Editor* editor = dynamic_cast<Editor*> (&ifv->get_time_axis_view().editor);
- return editor->canvas_imageframe_end_handle_event(item,event,ifv);
-}
-
-
-gint
-Editor::_canvas_imageframe_item_view_event(GnomeCanvasItem *item, GdkEvent* event, gpointer data)
-{
- ImageFrameView *ifv = (ImageFrameView *) data ;
- Editor* editor = dynamic_cast<Editor*> (&ifv->get_time_axis_view().editor);
- return editor->canvas_imageframe_item_view_event (item, event, ifv) ;
-}
-
-gint
-Editor::_canvas_imageframe_view_event(GnomeCanvasItem *item, GdkEvent* event, gpointer data)
-{
- ImageFrameTimeAxis *ifta = (ImageFrameTimeAxis*) data ;
- Editor* editor = dynamic_cast<Editor*> (&ifta->editor);
- return editor->canvas_imageframe_view_event (item, event, ifta);
-}
-
-gint
-Editor::_canvas_marker_time_axis_view_event(GnomeCanvasItem* item, GdkEvent* event, gpointer data)
-{
- MarkerTimeAxis* mta = (MarkerTimeAxis*)data ;
- Editor* editor = dynamic_cast<Editor*> (&mta->editor);
- return editor->canvas_marker_time_axis_view_event(item,event,mta);
-}
-
-gint
-Editor::_canvas_markerview_item_view_event(GnomeCanvasItem *item, GdkEvent* event, gpointer data)
-{
- MarkerView* mv = (MarkerView*) data ;
- Editor* editor = dynamic_cast<Editor*> (&mv->get_time_axis_view().editor);
- return editor->canvas_markerview_item_view_event(item,event,mv);
-}
-
-gint
-Editor::_canvas_markerview_start_handle_event(GnomeCanvasItem* item, GdkEvent* event, gpointer data)
-{
- MarkerView* mv = (MarkerView*)data ;
- Editor* editor = dynamic_cast<Editor*> (&mv->get_time_axis_view().editor);
- return editor->canvas_markerview_start_handle_event(item,event,mv);
-}
-
-gint
-Editor::_canvas_markerview_end_handle_event(GnomeCanvasItem* item, GdkEvent* event, gpointer data)
-{
- MarkerView* mv = (MarkerView*)data ;
- Editor* editor = dynamic_cast<Editor*> (&mv->get_time_axis_view().editor);
- return editor->canvas_markerview_end_handle_event(item,event,mv);
-}
-
-/**
- * ---------------------------------------------------------------------------------------------------
- * End of Static event handlers
- */
-
-gint
-Editor::canvas_imageframe_item_view_event(GnomeCanvasItem *item, GdkEvent *event, ImageFrameView *ifv)
+bool
+Editor::canvas_imageframe_item_view_event (GdkEvent *event, ArdourCanvas::Item* item, ImageFrameView *ifv)
{
gint ret = FALSE ;
ImageFrameTimeAxisGroup* iftag = 0 ;
return(ret) ;
}
-gint
-Editor::canvas_imageframe_start_handle_event(GnomeCanvasItem *item, GdkEvent *event, ImageFrameView *ifv)
+bool
+Editor::canvas_imageframe_start_handle_event (GdkEvent *event, ArdourCanvas::Item* item, ImageFrameView *ifv)
{
gint ret = FALSE ;
ImageFrameTimeAxisGroup* iftag = 0 ;
return(ret) ;
}
-gint
-Editor::canvas_imageframe_end_handle_event(GnomeCanvasItem *item, GdkEvent *event, ImageFrameView *ifv)
+bool
+Editor::canvas_imageframe_end_handle_event (GdkEvent *event, ArdourCanvas::Item* item, ImageFrameView *ifv)
{
gint ret = FALSE ;
ImageFrameTimeAxisGroup* iftag = 0 ;
return(ret) ;
}
-gint
-Editor::canvas_imageframe_view_event(GnomeCanvasItem* item, GdkEvent* event, ImageFrameTimeAxis* ifta)
+bool
+Editor::canvas_imageframe_view_event (GdkEvent* event, ArdourCanvas::Item* item, ImageFrameTimeAxis* ifta)
{
gint ret = FALSE ;
switch (event->type)
return(ret) ;
}
-gint
-Editor::canvas_marker_time_axis_view_event(GnomeCanvasItem *item, GdkEvent* event, MarkerTimeAxis* mta)
+bool
+Editor::canvas_marker_time_axis_view_event (GdkEvent* event, ArdourCanvas::Item* item, MarkerTimeAxis* mta)
{
gint ret = FALSE ;
switch (event->type)
}
-gint
-Editor::canvas_markerview_item_view_event(GnomeCanvasItem *item, GdkEvent* event, MarkerView* mta)
+bool
+Editor::canvas_markerview_item_view_event (GdkEvent* event, ArdourCanvas::Item* item, MarkerView* mta)
{
gint ret = FALSE ;
switch (event->type)
return(ret) ;
}
-gint
-Editor::canvas_markerview_start_handle_event(GnomeCanvasItem* item, GdkEvent* event, MarkerView* mta)
+bool
+Editor::canvas_markerview_start_handle_event (GdkEvent* event, ArdourCanvas::Item* item, MarkerView* mta)
{
gint ret = FALSE ;
switch (event->type)
return(ret) ;
}
-gint
-Editor::canvas_markerview_end_handle_event(GnomeCanvasItem* item, GdkEvent* event, MarkerView* mta)
+bool
+Editor::canvas_markerview_end_handle_event (GdkEvent* event, ArdourCanvas::Item* item, MarkerView* mta)
{
gint ret = FALSE ;
switch (event->type)
/* <CMT Additions file="editor_mouse.cc"> */
void
-Editor::start_imageframe_grab(GnomeCanvasItem* item, GdkEvent* event)
+Editor::start_imageframe_grab(ArdourCanvas::Item* item, GdkEvent* event)
{
ImageFrameView* ifv = ((ImageFrameTimeAxis*)clicked_trackview)->get_view()->get_selected_imageframe_view() ;
drag_info.copy = false ;
void
-Editor::start_markerview_grab(GnomeCanvasItem* item, GdkEvent* event)
+Editor::start_markerview_grab(ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = ((MarkerTimeAxis*)clicked_trackview)->get_view()->get_selected_time_axis_item() ;
drag_info.copy = false ;
void
-Editor::markerview_drag_motion_callback(GnomeCanvasItem*, GdkEvent* event)
+Editor::markerview_drag_motion_callback(ArdourCanvas::Item*, GdkEvent* event)
{
double cx, cy ;
MarkerView* mv = reinterpret_cast<MarkerView*>(drag_info.data) ;
- jack_nframes_t pending_region_position ;
- jack_nframes_t pointer_frame ;
+ nframes_t pending_region_position ;
+ nframes_t pointer_frame ;
pointer_frame = event_frame(event, &cx, &cy) ;
snap_to(pointer_frame) ;
- if (pointer_frame > (jack_nframes_t) drag_info.pointer_frame_offset)
+ if (pointer_frame > (nframes_t) drag_info.pointer_frame_offset)
{
pending_region_position = pointer_frame - drag_info.pointer_frame_offset ;
snap_to(pending_region_position) ;
}
void
-Editor::imageframe_drag_motion_callback(GnomeCanvasItem*, GdkEvent* event)
+Editor::imageframe_drag_motion_callback(ArdourCanvas::Item*, GdkEvent* event)
{
double cx, cy ;
ImageFrameView* ifv = reinterpret_cast<ImageFrameView*>(drag_info.data) ;
- jack_nframes_t pending_region_position;
- jack_nframes_t pointer_frame;
+ nframes_t pending_region_position;
+ nframes_t pointer_frame;
pointer_frame = event_frame(event, &cx, &cy) ;
snap_to(pointer_frame) ;
- if (pointer_frame > (jack_nframes_t) drag_info.pointer_frame_offset)
+ if (pointer_frame > (nframes_t) drag_info.pointer_frame_offset)
{
pending_region_position = pointer_frame - drag_info.pointer_frame_offset ;
snap_to(pending_region_position) ;
}
void
-Editor::timeaxis_item_drag_finished_callback(GnomeCanvasItem*, GdkEvent* event)
+Editor::timeaxis_item_drag_finished_callback(ArdourCanvas::Item*, GdkEvent* event)
{
- jack_nframes_t where ;
+ nframes_t where ;
TimeAxisViewItem* tavi = reinterpret_cast<TimeAxisViewItem*>(drag_info.data) ;
bool item_x_movement = (drag_info.last_frame_position != tavi->get_position()) ;
void
-Editor::imageframe_start_handle_op(GnomeCanvasItem* item, GdkEvent* event)
+Editor::imageframe_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event)
{
// get the selected item from the parent time axis
ImageFrameTimeAxis* ifta = dynamic_cast<ImageFrameTimeAxis*>(clicked_trackview) ;
drag_info.motion_callback = &Editor::imageframe_start_handle_trim_motion ;
drag_info.finished_callback = &Editor::imageframe_start_handle_end_trim ;
- flush_track_canvas() ;
-
start_grab(event) ;
show_verbose_time_cursor(ifv->get_position(), 10) ;
}
void
-Editor::imageframe_end_handle_op(GnomeCanvasItem* item, GdkEvent* event)
+Editor::imageframe_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event)
{
// get the selected item from the parent time axis
ImageFrameTimeAxis* ifta = dynamic_cast<ImageFrameTimeAxis*>(clicked_trackview) ;
drag_info.motion_callback = &Editor::imageframe_end_handle_trim_motion ;
drag_info.finished_callback = &Editor::imageframe_end_handle_end_trim ;
- flush_track_canvas() ;
-
start_grab(event, trimmer_cursor) ;
show_verbose_time_cursor(ifv->get_position() + ifv->get_duration(), 10) ;
}
void
-Editor::imageframe_start_handle_trim_motion(GnomeCanvasItem* item, GdkEvent* event)
+Editor::imageframe_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event)
{
ImageFrameView* ifv = reinterpret_cast<ImageFrameView*> (drag_info.data) ;
- jack_nframes_t start = 0 ;
- jack_nframes_t end = 0 ;
- jack_nframes_t pointer_frame = event_frame(event) ;
+ nframes_t start = 0 ;
+ nframes_t end = 0 ;
+ nframes_t pointer_frame = event_frame(event) ;
// chekc th eposition of the item is not locked
if(!ifv->get_position_locked()) {
}
// are we getting bigger or smaller?
- jack_nframes_t new_dur_val = end - start ;
+ nframes_t new_dur_val = end - start ;
// start handle, so a smaller pointer frame increases our component size
if(pointer_frame <= drag_info.grab_frame)
}
void
-Editor::imageframe_start_handle_end_trim(GnomeCanvasItem* item, GdkEvent* event)
+Editor::imageframe_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event)
{
ImageFrameView* ifv = reinterpret_cast<ImageFrameView *> (drag_info.data) ;
}
else
{
- jack_nframes_t temp = ifv->get_position() + ifv->get_duration() ;
+ nframes_t temp = ifv->get_position() + ifv->get_duration() ;
- ifv->set_position((jack_nframes_t) (temp - drag_info.cumulative_x_drag), this) ;
- ifv->set_duration((jack_nframes_t) drag_info.cumulative_x_drag, this) ;
+ ifv->set_position((nframes_t) (temp - drag_info.cumulative_x_drag), this) ;
+ ifv->set_duration((nframes_t) drag_info.cumulative_x_drag, this) ;
}
-
- flush_track_canvas() ;
}
void
-Editor::imageframe_end_handle_trim_motion(GnomeCanvasItem* item, GdkEvent* event)
+Editor::imageframe_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event)
{
ImageFrameView* ifv = reinterpret_cast<ImageFrameView *> (drag_info.data) ;
- jack_nframes_t start = 0 ;
- jack_nframes_t end = 0 ;
- jack_nframes_t pointer_frame = event_frame(event) ;
- jack_nframes_t new_dur_val = 0 ;
+ nframes_t start = 0 ;
+ nframes_t end = 0 ;
+ nframes_t pointer_frame = event_frame(event) ;
+ nframes_t new_dur_val = 0 ;
snap_to(pointer_frame) ;
void
-Editor::imageframe_end_handle_end_trim (GnomeCanvasItem* item, GdkEvent* event)
+Editor::imageframe_end_handle_end_trim (ArdourCanvas::Item* item, GdkEvent* event)
{
ImageFrameView* ifv = reinterpret_cast<ImageFrameView *> (drag_info.data) ;
}
else
{
- jack_nframes_t new_duration = (jack_nframes_t)drag_info.cumulative_x_drag ;
+ nframes_t new_duration = (nframes_t)drag_info.cumulative_x_drag ;
if((new_duration <= ifv->get_max_duration()) && (new_duration >= ifv->get_min_duration()))
{
ifv->set_duration(new_duration, this) ;
}
}
-
- flush_track_canvas ();
}
void
-Editor::markerview_item_start_handle_op(GnomeCanvasItem* item, GdkEvent* event)
+Editor::markerview_item_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = reinterpret_cast<MarkerTimeAxis*>(clicked_trackview)->get_view()->get_selected_time_axis_item() ;
drag_info.motion_callback = &Editor::markerview_start_handle_trim_motion ;
drag_info.finished_callback = &Editor::markerview_start_handle_end_trim ;
- flush_track_canvas() ;
-
start_grab(event, trimmer_cursor) ;
}
void
-Editor::markerview_item_end_handle_op(GnomeCanvasItem* item, GdkEvent* event)
+Editor::markerview_item_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = reinterpret_cast<MarkerTimeAxis*>(clicked_trackview)->get_view()->get_selected_time_axis_item() ;
if (mv == 0)
drag_info.motion_callback = &Editor::markerview_end_handle_trim_motion ;
drag_info.finished_callback = &Editor::markerview_end_handle_end_trim ;
- flush_track_canvas () ;
-
start_grab(event, trimmer_cursor) ;
}
void
-Editor::markerview_start_handle_trim_motion(GnomeCanvasItem* item, GdkEvent* event)
+Editor::markerview_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = reinterpret_cast<MarkerView*> (drag_info.data) ;
- jack_nframes_t start = 0 ;
- jack_nframes_t end = 0 ;
- jack_nframes_t pointer_frame = event_frame(event) ;
+ nframes_t start = 0 ;
+ nframes_t end = 0 ;
+ nframes_t pointer_frame = event_frame(event) ;
// chekc th eposition of the item is not locked
if(!mv->get_position_locked())
}
// are we getting bigger or smaller?
- jack_nframes_t new_dur_val = end - start ;
+ nframes_t new_dur_val = end - start ;
if(pointer_frame <= drag_info.grab_frame)
{
}
void
-Editor::markerview_start_handle_end_trim(GnomeCanvasItem* item, GdkEvent* event)
+Editor::markerview_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = reinterpret_cast<MarkerView*> (drag_info.data) ;
}
else
{
- jack_nframes_t temp = mv->get_position() + mv->get_duration() ;
+ nframes_t temp = mv->get_position() + mv->get_duration() ;
- mv->set_position((jack_nframes_t) (temp - drag_info.cumulative_x_drag), this) ;
- mv->set_duration((jack_nframes_t) drag_info.cumulative_x_drag, this) ;
+ mv->set_position((nframes_t) (temp - drag_info.cumulative_x_drag), this) ;
+ mv->set_duration((nframes_t) drag_info.cumulative_x_drag, this) ;
}
-
- flush_track_canvas() ;
}
void
-Editor::markerview_end_handle_trim_motion(GnomeCanvasItem* item, GdkEvent* event)
+Editor::markerview_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = reinterpret_cast<MarkerView*> (drag_info.data) ;
- jack_nframes_t start = 0 ;
- jack_nframes_t end = 0 ;
- jack_nframes_t pointer_frame = event_frame(event) ;
- jack_nframes_t new_dur_val = 0 ;
+ nframes_t start = 0 ;
+ nframes_t end = 0 ;
+ nframes_t pointer_frame = event_frame(event) ;
+ nframes_t new_dur_val = 0 ;
snap_to(pointer_frame) ;
{
// we cant extend beyond the item we are marking
ImageFrameView* marked_item = mv->get_marked_item() ;
- jack_nframes_t marked_end = marked_item->get_position() + marked_item->get_duration() ;
+ nframes_t marked_end = marked_item->get_position() + marked_item->get_duration() ;
if(mv->get_max_duration_active() && (new_dur_val > mv->get_max_duration()))
{
void
-Editor::markerview_end_handle_end_trim (GnomeCanvasItem* item, GdkEvent* event)
+Editor::markerview_end_handle_end_trim (ArdourCanvas::Item* item, GdkEvent* event)
{
MarkerView* mv = reinterpret_cast<MarkerView*> (drag_info.data) ;
}
else
{
- jack_nframes_t new_duration = (jack_nframes_t)drag_info.cumulative_x_drag ;
+ nframes_t new_duration = (nframes_t)drag_info.cumulative_x_drag ;
mv->set_duration(new_duration, this) ;
}
-
- flush_track_canvas() ;
}
/* <CMT Additions file="editor_route_list.cc"> */
void
-Editor::handle_new_imageframe_time_axis_view(std::string track_name, void* src)
+Editor::handle_new_imageframe_time_axis_view(const string & track_name, void* src)
{
ImageFrameTimeAxis* iftav ;
iftav = new ImageFrameTimeAxis(track_name, *this, *session, track_canvas) ;
iftav->set_time_axis_name(track_name, this) ;
track_views.push_back(iftav) ;
- TreeModel::Row row = *(route_display_mode->append());
+ TreeModel::Row row = *(route_display_model->append());
row[route_display_columns.text] = iftav->name();
row[route_display_columns.tv] = iftav;
- route_list.get_selection()->select (row);
+ route_list_display.get_selection()->select (row);
iftav->GoingAway.connect(bind(mem_fun(*this, &Editor::remove_route), (TimeAxisView*)iftav)) ;
iftav->gui_changed.connect(mem_fun(*this, &Editor::handle_gui_changes)) ;
}
void
-Editor::handle_new_imageframe_marker_time_axis_view(std::string track_name, TimeAxisView* marked_track)
+Editor::handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track)
{
MarkerTimeAxis* mta = new MarkerTimeAxis (*this, *this->current_session(), track_canvas, track_name, marked_track) ;
((ImageFrameTimeAxis*)marked_track)->add_marker_time_axis(mta, this) ;
track_views.push_back(mta) ;
- TreeModel::Row row = *(route_display_mode->append());
+ TreeModel::Row row = *(route_display_model->append());
row[route_display_columns.text] = mta->name();
row[route_display_columns.tv] = mta;
- route_list.get_selection()->select (row);
+ route_list_display.get_selection()->select (row);
mta->GoingAway.connect(bind(mem_fun(*this, &Editor::remove_route), (TimeAxisView*)mta)) ;
}