diff --git a/ChangeLog b/ChangeLog index 266c7739..f4b0db5a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-03-31 Bart Hakvoort + + * include/DialogManageFlags.h, + include/GParted_Core.h, + include/Makefile.am, + include/Utils.h, + include/Win_GParted.h, + src/DialogManageFlags.cc, + src/GParted_Core.cc, + src/Makefile.am, + src/Win_GParted.cc: add 'flag management' (#330453) + 2006-03-29 Bart Hakvoort * include/Partition.h, diff --git a/include/DialogManageFlags.h b/include/DialogManageFlags.h new file mode 100644 index 00000000..090bce7c --- /dev/null +++ b/include/DialogManageFlags.h @@ -0,0 +1,72 @@ +/* Copyright (C) 2004 Bart + * + * 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +#ifndef DIALOG_MANAGE_FLAGS +#define DIALOG_MANAGE_FLAGS + +#include "../include/Partition.h" + +#include +#include +#include + +namespace GParted +{ + +class DialogManageFlags : public Gtk::Dialog +{ +public: + DialogManageFlags( const Partition & partition ) ; + + sigc::signal< std::map, const Partition & > signal_get_flags ; + sigc::signal< bool, const Partition &, const Glib::ustring &, bool > signal_toggle_flag ; + + bool any_change ; + +private: + void on_show() ; + + void load_flags() ; + void on_flag_toggled( const Glib::ustring & path ) ; + + + Gtk::TreeView treeview_flags ; + Gtk::TreeRow row ; + + Glib::RefPtr liststore_flags ; + + struct treeview_flags_Columns : public Gtk::TreeModelColumnRecord + { + Gtk::TreeModelColumn flag ; + Gtk::TreeModelColumn status ; + + treeview_flags_Columns() + { + add( flag ) ; + add( status ) ; + } + } ; + treeview_flags_Columns treeview_flags_columns ; + + Partition partition ; +}; + +} //GParted + + +#endif //DIALOG_MANAGE_FLAGS diff --git a/include/GParted_Core.h b/include/GParted_Core.h index e5c28f1a..83807ff4 100644 --- a/include/GParted_Core.h +++ b/include/GParted_Core.h @@ -70,6 +70,8 @@ public: const FS & get_fs( GParted::FILESYSTEM filesystem ) const ; std::vector get_disklabeltypes() ; std::vector get_all_mountpoints() ; + std::map get_available_flags( const Partition & partition ) ; + bool toggle_flag( const Partition & partition, const Glib::ustring & flag, bool state ) ; private: GParted::FILESYSTEM get_filesystem() ; diff --git a/include/Makefile.am b/include/Makefile.am index 9274ff72..cf486cc7 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -10,6 +10,7 @@ EXTRA_DIST = \ Dialog_Partition_New.h \ Dialog_Partition_Resize_Move.h \ Dialog_Progress.h \ + DialogManageFlags.h \ DrawingAreaVisualDisk.h \ FileSystem.h \ Frame_Resizer_Base.h \ diff --git a/include/Utils.h b/include/Utils.h index b8b6c63e..582c326e 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -65,7 +65,7 @@ enum FILESYSTEM FS_USED = 17, FS_UNUSED = 18 -}; +} ; enum SIZE_UNIT { @@ -75,8 +75,8 @@ enum SIZE_UNIT UNIT_KIB = 2, UNIT_MIB = 3, UNIT_GIB = 4, - UNIT_TIB = 5, -}; + UNIT_TIB = 5 +} ; //struct to store filesysteminformation struct FS @@ -105,7 +105,7 @@ struct FS read = create = grow = shrink = move = check = copy = NONE; MIN = MAX = 0 ; } -}; +} ; class Utils diff --git a/include/Win_GParted.h b/include/Win_GParted.h index 86f5c0c0..c0863e8c 100644 --- a/include/Win_GParted.h +++ b/include/Win_GParted.h @@ -95,9 +95,12 @@ private: void allow_toggle_swap_mount_state( bool b ) { menu_partition .items()[ 10 ] .set_sensitive( b ); } + + void allow_manage_flags( bool b ) { + menu_partition .items()[ 13 ] .set_sensitive( b ) ; } void allow_info( bool b ) { - menu_partition .items()[ 13 ] .set_sensitive( b ); } + menu_partition .items()[ 15 ] .set_sensitive( b ); } void allow_undo( bool b ) { toolbar_main .get_nth_item( 8 ) ->set_sensitive( b ); @@ -148,6 +151,7 @@ private: void toggle_swap_mount_state() ; void activate_mount_partition( unsigned int index ) ; void activate_disklabel() ; + void activate_manage_flags() ; void activate_undo(); void remove_operation( int index = -1, bool remove_all = false ) ; diff --git a/src/DialogManageFlags.cc b/src/DialogManageFlags.cc new file mode 100644 index 00000000..faad6175 --- /dev/null +++ b/src/DialogManageFlags.cc @@ -0,0 +1,97 @@ +/* Copyright (C) 2004 Bart + * + * 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "../include/DialogManageFlags.h" + +#include +#include + +namespace GParted +{ + +DialogManageFlags::DialogManageFlags( const Partition & partition ) +{ + any_change = false ; + + set_title( String::ucompose( _("Manage flags on %1"), partition .get_path() ) ); + set_has_separator( false ) ; + set_size_request( 300, -1 ) ; + set_resizable( false ); + + Glib::ustring str_temp = "" ; + str_temp += String::ucompose( _("Manage flags on %1"), partition .get_path() ) ; + str_temp += "\n" ; + get_vbox() ->pack_start( * Utils::mk_label( str_temp ), Gtk::PACK_SHRINK ); + + //setup treeview + liststore_flags = Gtk::ListStore::create( treeview_flags_columns ) ; + treeview_flags .set_model( liststore_flags ) ; + treeview_flags .set_headers_visible( false ) ; + + treeview_flags .append_column( "", treeview_flags_columns .status ) ; + treeview_flags .append_column( "", treeview_flags_columns .flag ) ; + static_cast( treeview_flags .get_column_cell_renderer( 0 ) ) + ->property_activatable() = true ; + static_cast( treeview_flags .get_column_cell_renderer( 0 ) ) + ->signal_toggled() .connect( sigc::mem_fun( *this, &DialogManageFlags::on_flag_toggled ) ) ; + + get_vbox() ->pack_start( treeview_flags, Gtk::PACK_SHRINK ) ; + + this ->partition = partition ; + + add_button( Gtk::Stock::CLOSE, Gtk::RESPONSE_OK ) ->grab_focus() ; + + show_all_children() ; +} + +void DialogManageFlags::on_show() +{ + Dialog::on_show() ; + + while ( Gtk::Main::events_pending() ) + Gtk::Main::iteration() ; + + load_flags() ; +} + +void DialogManageFlags::load_flags() +{ + liststore_flags ->clear() ; + + std::map flag_info = signal_get_flags .emit( partition ) ; + + for ( std::map::iterator iter = flag_info .begin() ; iter != flag_info .end() ; ++iter ) + { + row = *( liststore_flags ->append() ) ; + row[ treeview_flags_columns .flag ] = iter ->first ; + row[ treeview_flags_columns .status ] = iter ->second ; + } +} + +void DialogManageFlags::on_flag_toggled( const Glib::ustring & path ) +{ + any_change = true ; + + row = *( liststore_flags ->get_iter( path ) ) ; + row[ treeview_flags_columns .status ] = ! row[ treeview_flags_columns .status ] ; + + signal_toggle_flag .emit( partition, row[ treeview_flags_columns .flag ], row[ treeview_flags_columns .status ] ) ; + + load_flags() ; +} + +}//GParted diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 984d1ce2..4e41131a 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -44,7 +44,7 @@ GParted_Core::GParted_Core() for ( PedPartitionFlag flag = ped_partition_flag_next( static_cast( NULL ) ) ; flag ; flag = ped_partition_flag_next( flag ) ) - flags .push_back( flag ) ; + flags .push_back( flag ) ; //throw libpartedversion to the stdout to see which version is actually used. std::cout << "======================" << std::endl ; @@ -769,14 +769,14 @@ const std::vector & GParted_Core::get_filesystems() const const FS & GParted_Core::get_fs( GParted::FILESYSTEM filesystem ) const { - for ( unsigned int t = 0 ; t < FILESYSTEMS .size( ) ; t++ ) + for ( unsigned int t = 0 ; t < FILESYSTEMS .size() ; t++ ) if ( FILESYSTEMS[ t ] .filesystem == filesystem ) return FILESYSTEMS[ t ] ; - return FILESYSTEMS .back( ) ; + return FILESYSTEMS .back() ; } -std::vector GParted_Core::get_disklabeltypes( ) +std::vector GParted_Core::get_disklabeltypes() { std::vector disklabeltypes ; @@ -800,7 +800,63 @@ std::vector GParted_Core::get_all_mountpoints() return mountpoints ; } + +std::map GParted_Core::get_available_flags( const Partition & partition ) +{ + std::map flag_info ; + if ( open_device_and_disk( partition .device_path ) ) + { + lp_partition = NULL ; + if ( partition .type == GParted::TYPE_EXTENDED ) + lp_partition = ped_disk_extended_partition( lp_disk ) ; + else + lp_partition = ped_disk_get_partition_by_sector( + lp_disk, + (partition .sector_end + partition .sector_start) / 2 ) ; + + if ( lp_partition ) + { + for ( unsigned int t = 0 ; t < flags .size() ; t++ ) + if ( ped_partition_is_flag_available( lp_partition, flags[ t ] ) ) + flag_info[ ped_partition_flag_get_name( flags[ t ] ) ] = + ped_partition_get_flag( lp_partition, flags[ t ] ) ; + } + + close_device_and_disk() ; + } + + return flag_info ; +} + +bool GParted_Core::toggle_flag( const Partition & partition, const Glib::ustring & flag, bool state ) +{ + bool succes = false ; + + if ( open_device_and_disk( partition .device_path ) ) + { + lp_partition = NULL ; + if ( partition .type == GParted::TYPE_EXTENDED ) + lp_partition = ped_disk_extended_partition( lp_disk ) ; + else + lp_partition = ped_disk_get_partition_by_sector( + lp_disk, + (partition .sector_end + partition .sector_start) / 2 ) ; + + if ( lp_partition ) + { + PedPartitionFlag lp_flag = ped_partition_flag_get_by_name( flag .c_str() ) ; + + if ( lp_flag > 0 && ped_partition_set_flag( lp_partition, lp_flag, state ) ) + succes = commit() ; + } + + close_device_and_disk() ; + } + + return succes ; +} + void GParted_Core::LP_Set_Used_Sectors( Partition & partition ) { PedFileSystem *fs = NULL; @@ -1104,7 +1160,8 @@ bool GParted_Core::resize_normal_using_libparted( const Partition & partition_ol void GParted_Core::set_flags( Partition & partition ) { for ( unsigned int t = 0 ; t < flags .size() ; t++ ) - if ( ped_partition_get_flag( lp_partition, flags[ t ] ) ) + if ( ped_partition_is_flag_available( lp_partition, flags[ t ] ) && + ped_partition_get_flag( lp_partition, flags[ t ] ) ) partition .flags .push_back( ped_partition_flag_get_name( flags[ t ] ) ) ; } diff --git a/src/Makefile.am b/src/Makefile.am index 8fb628a9..e86bf462 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,7 @@ gparted_SOURCES = \ Dialog_Partition_New.cc \ Dialog_Partition_Resize_Move.cc \ Dialog_Progress.cc \ + DialogManageFlags.cc \ DrawingAreaVisualDisk.cc \ FileSystem.cc \ Frame_Resizer_Base.cc \ diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index 047dec75..6110f4cb 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -23,6 +23,7 @@ #include "../include/Dialog_Partition_Copy.h" #include "../include/Dialog_Partition_New.h" #include "../include/Dialog_Partition_Info.h" +#include "../include/DialogManageFlags.h" #include "../include/OperationCopy.h" #include "../include/OperationCreate.h" #include "../include/OperationDelete.h" @@ -262,7 +263,13 @@ void Win_GParted::init_partition_menu() menu_partition .items() .push_back( Gtk::Menu_Helpers::MenuElem( _("mount on"), * manage( new Gtk::Menu() ) ) ) ; - menu_partition .items() .push_back( Gtk::Menu_Helpers::SeparatorElem() ); + menu_partition .items() .push_back( Gtk::Menu_Helpers::SeparatorElem() ) ; + + menu_partition .items() .push_back( + Gtk::Menu_Helpers::MenuElem( _("manage flags"), + sigc::mem_fun( *this, &Win_GParted::activate_manage_flags ) ) ); + + menu_partition .items() .push_back( Gtk::Menu_Helpers::SeparatorElem() ) ; menu_partition .items() .push_back( Gtk::Menu_Helpers::StockMenuElem( Gtk::Stock::DIALOG_INFO, @@ -724,7 +731,7 @@ void Win_GParted::set_valid_operations() { allow_new( false ); allow_delete( false ); allow_resize( false ); allow_copy( false ); allow_paste( false ); allow_format( false ); allow_toggle_swap_mount_state( false ) ; - allow_info( false ) ; + allow_manage_flags( false ) ; allow_info( false ) ; dynamic_cast(menu_partition .items()[ 10 ] .get_child() ) ->set_label( _("unmount") ) ; menu_partition .items()[ 10 ] .show() ; @@ -736,6 +743,10 @@ void Win_GParted::set_valid_operations() //if there's something, there's some info ;) allow_info( true ) ; + + //flag managing.. + if ( selected_partition .type != GParted::TYPE_UNALLOCATED && selected_partition .status == GParted::STAT_REAL ) + allow_manage_flags( true ) ; //deal with swap... if ( selected_partition .filesystem == GParted::FS_LINUX_SWAP ) @@ -754,7 +765,7 @@ void Win_GParted::set_valid_operations() dynamic_cast(menu_partition .items()[ 10 ] .get_child() ) ->set_label( _("swapon") ) ; } - + //only unmount is allowed (if ! extended) if ( selected_partition .busy ) { @@ -794,8 +805,8 @@ void Win_GParted::set_valid_operations() allow_delete( true ) ; if ( ! devices[ current_device ] .readonly ) - allow_resize( true ); - + allow_resize( true ) ; + return ; } @@ -1658,6 +1669,23 @@ void Win_GParted::activate_disklabel() menu_gparted_refresh_devices() ; } } + +void Win_GParted::activate_manage_flags() +{ + DialogManageFlags dialog( selected_partition ) ; + dialog .set_transient_for( *this ) ; + + dialog .signal_get_flags .connect( + sigc::mem_fun( &gparted_core, &GParted_Core::get_available_flags ) ) ; + dialog .signal_toggle_flag .connect( + sigc::mem_fun( &gparted_core, &GParted_Core::toggle_flag ) ) ; + + dialog .run() ; + dialog .hide() ; + + if ( dialog .any_change ) + menu_gparted_refresh_devices() ; +} void Win_GParted::activate_undo() {