#include <modest-ui-constants.h>
#include <modest-selector-picker.h>
#include <modest-icon-names.h>
+#include <modest-count-stream.h>
#ifdef MODEST_HAVE_MCE
#include <mce/dbus-names.h>
static gboolean
check_required_files (void)
{
- FILE *mcc_file = modest_utils_open_mcc_mapping_file (NULL);
+ FILE *mcc_file = modest_utils_open_mcc_mapping_file (FALSE, NULL);
if (!mcc_file) {
- g_printerr ("modest: check for mcc file failed\n");
+ g_printerr ("modest: check for mcc file (for LANG) failed\n");
+ return FALSE;
+ } else
+ fclose (mcc_file);
+
+ mcc_file = modest_utils_open_mcc_mapping_file (TRUE, NULL);
+ if (!mcc_file) {
+ g_printerr ("modest: check for mcc file (for LC_MESSAGES) failed\n");
return FALSE;
} else
fclose (mcc_file);
parent = g_object_get_data (G_OBJECT (picker), FOLDER_PICKER_CURRENT_FOLDER);
/* Look for another folder with the same name */
- if (modest_tny_folder_has_subfolder_with_name (parent, new_name, TRUE))
+ if (!TNY_IS_MERGE_FOLDER (parent) &&
+ modest_tny_folder_has_subfolder_with_name (parent, new_name, TRUE))
exists = TRUE;
if (!exists) {
store = folder_chooser_dialog_run (helper->folder_view);
if (store) {
const gchar *current_name;
- gboolean exists;
+ gboolean exists = FALSE;
folder_picker_set_store (GTK_BUTTON (button), store);
/* Update the name of the folder */
current_name = gtk_entry_get_text (helper->entry);
- exists = modest_tny_folder_has_subfolder_with_name (store,
- current_name,
- TRUE);
+
+ if (TNY_IS_FOLDER_STORE (store))
+ exists = modest_tny_folder_has_subfolder_with_name (store,
+ current_name,
+ TRUE);
if (exists) {
gchar *new_name = get_next_folder_name (NULL, store);
gtk_entry_set_text (helper->entry, new_name);
}
}
-void
+void
modest_platform_on_new_headers_received (TnyList *header_list,
gboolean show_visual)
{
- g_return_if_fail (TNY_IS_LIST(header_list));
+ g_return_if_fail (TNY_IS_LIST (header_list));
- if (tny_list_get_length(header_list) == 0) {
- g_warning ("%s: header list is empty", __FUNCTION__);
+ if (tny_list_get_length (header_list) < 1)
return;
- }
- if (!show_visual) {
- modest_platform_push_email_notification ();
- /* We do a return here to avoid indentation with an else */
+ /* If the window is in the foreground don't do anything */
+ if (hildon_program_get_is_topmost (hildon_program_get_instance ()))
return;
- }
#ifdef MODEST_HAVE_HILDON_NOTIFY
+ /* For any other case issue a notification */
HildonNotification *notification;
TnyIterator *iter;
GSList *notifications_list = NULL;
first_notification = FALSE;
- /* Set the led pattern */
+ /* Set the led pattern and make the notification persistent */
notify_notification_set_hint_int32 (NOTIFY_NOTIFICATION (notification),
"dialog-type", 4);
notify_notification_set_hint_string(NOTIFY_NOTIFICATION (notification),
"led-pattern",
MODEST_NEW_MAIL_LIGHTING_PATTERN);
+ notify_notification_set_hint_byte (NOTIFY_NOTIFICATION (notification),
+ "persistent", TRUE);
/* Set the account of the headers */
account = tny_folder_get_account (folder);
/* We don't listen for the "closed" signal, because we
don't care about if the notification was removed or
not to store the list in gconf */
-
+
/* Free & carry on */
g_free (display_address);
g_free (url);
notifications_list, MODEST_CONF_VALUE_INT, NULL);
g_slist_free (notifications_list);
-
+
#endif /*MODEST_HAVE_HILDON_NOTIFY*/
}
}
}
-GtkWidget *
-modest_platform_create_folder_view (TnyFolderStoreQuery *query)
+static GtkWidget *
+modest_platform_create_folder_view_full (TnyFolderStoreQuery *query, gboolean do_refresh)
{
- GtkWidget *widget = modest_folder_view_new (query);
+ GtkWidget *widget = modest_folder_view_new_full (query, do_refresh);
/* Show one account by default */
modest_folder_view_set_style (MODEST_FOLDER_VIEW (widget),
return widget;
}
+GtkWidget *
+modest_platform_create_folder_view (TnyFolderStoreQuery *query)
+{
+ return modest_platform_create_folder_view_full (query, TRUE);
+}
+
void
banner_finish (gpointer data, GObject *object)
{
dialog);
}
+typedef struct _HeaderDetailsGetSizeInfo {
+ GtkWidget *dialog;
+ TnyMimePart *part;
+ guint total;
+} HeaderDetailsGetSizeInfo;
+
+static void
+header_details_dialog_destroy (gpointer userdata,
+ GObject *object)
+{
+ HeaderDetailsGetSizeInfo *info = (HeaderDetailsGetSizeInfo *) userdata;
+
+ info->dialog = NULL;
+}
+
+static gboolean
+idle_get_mime_part_size_cb (gpointer userdata)
+{
+ HeaderDetailsGetSizeInfo *info = (HeaderDetailsGetSizeInfo *) userdata;
+ gdk_threads_enter ();
+
+ if (info->dialog && GTK_WIDGET_VISIBLE (info->dialog)) {
+ modest_details_dialog_set_message_size (MODEST_DETAILS_DIALOG (info->dialog),
+ info->total);
+ }
+
+ if (info->dialog) {
+ g_object_weak_unref (G_OBJECT (info->dialog), header_details_dialog_destroy, info);
+ info->dialog = NULL;
+ }
+ g_object_unref (info->part);
+ g_slice_free (HeaderDetailsGetSizeInfo, info);
+
+ gdk_threads_leave ();
+
+ return FALSE;
+}
+
+static gpointer
+get_mime_part_size_thread (gpointer thr_user_data)
+{
+ HeaderDetailsGetSizeInfo *info = (HeaderDetailsGetSizeInfo *) thr_user_data;
+ gssize result = 0;
+ TnyStream *count_stream;
+
+ count_stream = modest_count_stream_new ();
+ result = tny_mime_part_decode_to_stream (info->part, count_stream, NULL);
+ info->total = modest_count_stream_get_count(MODEST_COUNT_STREAM (count_stream));
+ if (info->total == 0) {
+ modest_count_stream_reset_count(MODEST_COUNT_STREAM (count_stream));
+ result = tny_mime_part_write_to_stream (info->part, count_stream, NULL);
+ info->total = modest_count_stream_get_count(MODEST_COUNT_STREAM (count_stream));
+ }
+
+ /* if there was an error, don't set the size (this is pretty uncommon) */
+ if (result < 0) {
+ g_warning ("%s: error while writing mime part to stream\n", __FUNCTION__);
+ }
+ g_idle_add (idle_get_mime_part_size_cb, info);
+
+ return NULL;
+}
+
void
modest_platform_run_header_details_dialog (GtkWindow *parent_window,
- TnyHeader *header)
+ TnyHeader *header,
+ gboolean async_get_size,
+ TnyMsg *msg)
{
GtkWidget *dialog;
/* Create dialog */
- dialog = modest_hildon2_details_dialog_new_with_header (parent_window, header);
+ dialog = modest_hildon2_details_dialog_new_with_header (parent_window, header, !async_get_size);
+
+ if (async_get_size && msg && TNY_IS_MSG (msg)) {
+ HeaderDetailsGetSizeInfo *info;
+ info = g_slice_new (HeaderDetailsGetSizeInfo);
+ info->dialog = dialog;
+ info->total = 0;
+ info->part = TNY_MIME_PART (g_object_ref (msg));
+
+ g_object_weak_ref (G_OBJECT (dialog), header_details_dialog_destroy, info);
+ g_thread_create (get_mime_part_size_thread, info, FALSE, NULL);
+ }
/* Run dialog */
modest_window_mgr_set_modal (modest_runtime_get_window_mgr (),
GtkWidget *action_button;
GtkWidget *image = NULL;
TnyAccount *account;
- gchar *account_name = NULL;
+ gchar *account_name = NULL, *short_name = NULL;
action_button = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), MOVE_TO_DIALOG_ACTION_BUTTON));
g_object_unref (account);
/* Set title of button: account or folder name */
- if (TNY_IS_FOLDER (folder_store)) {
- hildon_button_set_title (HILDON_BUTTON (action_button),
- tny_folder_get_name (TNY_FOLDER (folder_store)));
- } else {
- hildon_button_set_title (HILDON_BUTTON (action_button), account_name);
- }
+ if (TNY_IS_FOLDER (folder_store))
+ short_name = folder_store_get_display_name (folder_store);
+ else
+ short_name = g_strdup (account_name);
+
+ hildon_button_set_title (HILDON_BUTTON (action_button), short_name);
/* Set value of button, folder full name */
if (TNY_IS_CAMEL_FOLDER (folder_store)) {
- gchar *full_name = g_strconcat (account_name, MOVE_TO_FOLDER_SEPARATOR,
- tny_camel_folder_get_full_name (TNY_CAMEL_FOLDER (folder_store)),
- NULL);
+ const gchar *camel_full_name;
+ gchar *last_slash, *full_name;
+
+ camel_full_name = tny_camel_folder_get_full_name (TNY_CAMEL_FOLDER (folder_store));
+ last_slash = g_strrstr (camel_full_name, "/");
+ if (last_slash) {
+ gchar *prefix = g_strndup (camel_full_name, last_slash - camel_full_name + 1);
+ full_name = g_strconcat (account_name, MOVE_TO_FOLDER_SEPARATOR, prefix, short_name, NULL);
+ g_free (prefix);
+ } else {
+ full_name = g_strconcat (account_name, MOVE_TO_FOLDER_SEPARATOR,
+ short_name,
+ NULL);
+ }
hildon_button_set_value (HILDON_BUTTON (action_button), full_name);
g_free (full_name);
}
g_free (account_name);
+ g_free (short_name);
/* Set image for the button */
image = get_image_for_folder_store (folder_store, MODEST_ICON_SIZE_BIG);
on_move_to_dialog_action_clicked (GtkButton *selection,
gpointer user_data)
{
- TnyFolderStore *selected;
GtkWidget *dialog;
- GtkWidget *folder_view;
gboolean showing_folders;
dialog = (GtkWidget *) user_data;
showing_folders = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), MOVE_TO_DIALOG_SHOWING_FOLDERS));
if (showing_folders) {
+ TnyFolderStore *selected;
+ GtkWidget *folder_view;
+
folder_view = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog), MOVE_TO_DIALOG_FOLDER_VIEW));
selected = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
- if (selected)
+ if (selected) {
gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ g_object_unref (selected);
+ }
}
}
+static void
+move_to_dialog_activity_changed (ModestFolderView *folder_view, gboolean activity, GtkDialog *dialog)
+{
+ hildon_gtk_window_set_progress_indicator (GTK_WINDOW (dialog), activity?1:0);
+}
+
GtkWidget *
modest_platform_create_move_to_dialog (GtkWindow *parent_window,
GtkWidget **folder_view)
top_vbox = gtk_vbox_new (FALSE, MODEST_MARGIN_HALF);
/* Create folder view */
- *folder_view = modest_platform_create_folder_view (NULL);
+ *folder_view = modest_platform_create_folder_view_full (NULL, FALSE);
+ g_signal_connect (G_OBJECT (*folder_view), "activity-changed", G_CALLBACK (move_to_dialog_activity_changed),
+ dialog);
modest_folder_view_set_cell_style (MODEST_FOLDER_VIEW (*folder_view),
MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT);