index 4f9c33ff5946c642a33517184a65eaca0c26c36d..2196ef0de4091acde803385591acc35def231f8e 100644 (file)
-/**
- * Implementation of the file dialog interfaces defined in filedialog.h for Win32
- *
- * Authors:
+/** @file
+ * @brief Implementation of native file dialogs for Win32
+ */
+/* Authors:
* Joel Holdsworth
* The Inkscape Organization
*
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#ifdef WIN32
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-#ifdef WIN32
-
//General includes
#include <list>
#include <unistd.h>
//Inkscape includes
#include "inkscape.h"
-#include "prefs-utils.h"
#include <dialogs/dialog-events.h>
#include <extension/input.h>
#include <extension/output.h>
_filter_index = 1;
_filter_count = 0;
-
+
_title = (wchar_t*)g_utf8_to_utf16(title, -1, NULL, NULL, NULL);
g_assert(_title != NULL);
_preview_image_width = 0;
_preview_image_height = 0;
_preview_emf_image = false;
-
+
_mutex = NULL;
createFilterMenu();
Inkscape::Extension::DB::InputList extension_list;
Inkscape::Extension::db.get_input_list(extension_list);
- ustring all_inkscape_files_filter, all_image_files_filter;
- Filter all_files, all_inkscape_files, all_image_files;
+ ustring all_inkscape_files_filter, all_image_files_filter, all_vectors_filter, all_bitmaps_filter;
+ Filter all_files, all_inkscape_files, all_image_files, all_vectors, all_bitmaps;
const gchar *all_files_filter_name = N_("All Files");
const gchar *all_inkscape_files_filter_name = N_("All Inkscape Files");
- const gchar *all_image_files_filter_name = N_("All Image Files");
+ const gchar *all_image_files_filter_name = N_("All Images");
+ const gchar *all_vectors_filter_name = N_("All Vectors");
+ const gchar *all_bitmaps_filter_name = N_("All Bitmaps");
// Calculate the amount of memory required
- int filter_count = 3; // 3 - one for All Files, All Images and All Inkscape Files
+ int filter_count = 5; // 5 - one for each filter type
int filter_length = 1;
for (Inkscape::Extension::DB::InputList::iterator current_item = extension_list.begin();
all_image_files_filter += file_extension_name;
}
+ // I don't know of any other way to define "bitmap" formats other than by listing them
+ // if you change it here, do the same change in filedialogimpl-gtkmm
+ if (
+ strncmp("image/png", imod->get_mimetype(), 9)==0 ||
+ strncmp("image/jpeg", imod->get_mimetype(), 10)==0 ||
+ strncmp("image/gif", imod->get_mimetype(), 9)==0 ||
+ strncmp("image/x-icon", imod->get_mimetype(), 12)==0 ||
+ strncmp("image/x-navi-animation", imod->get_mimetype(), 22)==0 ||
+ strncmp("image/x-cmu-raster", imod->get_mimetype(), 18)==0 ||
+ strncmp("image/x-xpixmap", imod->get_mimetype(), 15)==0 ||
+ strncmp("image/bmp", imod->get_mimetype(), 9)==0 ||
+ strncmp("image/vnd.wap.wbmp", imod->get_mimetype(), 18)==0 ||
+ strncmp("image/tiff", imod->get_mimetype(), 10)==0 ||
+ strncmp("image/x-xbitmap", imod->get_mimetype(), 15)==0 ||
+ strncmp("image/x-tga", imod->get_mimetype(), 11)==0 ||
+ strncmp("image/x-pcx", imod->get_mimetype(), 11)==0
+ ) {
+ if(all_bitmaps_filter.length() > 0)
+ all_bitmaps_filter += ";*";
+ all_bitmaps_filter += file_extension_name;
+ } else {
+ if(all_vectors_filter.length() > 0)
+ all_vectors_filter += ";*";
+ all_vectors_filter += file_extension_name;
+ }
+
filter_count++;
}
int extension_index = 0;
_extension_map = new Inkscape::Extension::Extension*[filter_count];
+ // Filter bitmap files
+ all_bitmaps.name = g_utf8_to_utf16(all_bitmaps_filter_name,
+ -1, NULL, &all_bitmaps.name_length, NULL);
+ all_bitmaps.filter = g_utf8_to_utf16(all_bitmaps_filter.data(),
+ -1, NULL, &all_bitmaps.filter_length, NULL);
+ all_bitmaps.mod = NULL;
+ filter_list.push_front(all_bitmaps);
+
+ // Filter vector files
+ all_vectors.name = g_utf8_to_utf16(all_vectors_filter_name,
+ -1, NULL, &all_vectors.name_length, NULL);
+ all_vectors.filter = g_utf8_to_utf16(all_vectors_filter.data(),
+ -1, NULL, &all_vectors.filter_length, NULL);
+ all_vectors.mod = NULL;
+ filter_list.push_front(all_vectors);
+
// Filter Image Files
all_image_files.name = g_utf8_to_utf16(all_image_files_filter_name,
-1, NULL, &all_image_files.name_length, NULL);
all_inkscape_files.filter_length +
all_inkscape_files.name_length + 3 +
all_image_files.filter_length +
- all_image_files.name_length + 3 + 1;
+ all_image_files.name_length + 3 +
+ all_vectors.filter_length +
+ all_vectors.name_length + 3 +
+ all_bitmaps.filter_length +
+ all_bitmaps.name_length + 3 +
+ 1;
// Add 3 for 2*2 \0s and a *, and 1 for a trailing \0
-
+
_filter = new wchar_t[filter_length];
wchar_t *filterptr = _filter;
-
+
for(list<Filter>::iterator filter_iterator = filter_list.begin();
filter_iterator != filter_list.end(); filter_iterator++)
{
_extension_map[extension_index++] = filter.mod;
}
*(filterptr++) = L'\0';
-
+
_filter_count = extension_index;
_filter_index = 2; // Select the 2nd filter in the list - 2 is NOT the 3rd
}
g_assert(this != NULL);
g_assert(_mutex != NULL);
-
+
WCHAR* current_directory_string = (WCHAR*)g_utf8_to_utf16(
_current_directory.data(), _current_directory.length(),
NULL, NULL, NULL);
@@ -561,9 +608,12 @@ LRESULT CALLBACK FileOpenDialogImplWin32::preview_wnd_proc(HWND hwnd, UINT uMsg,
if(pImpl->_path_string[0] == 0)
{
+ WCHAR* noFileText=(WCHAR*)g_utf8_to_utf16(_("No file selected"),
+ -1, NULL, NULL, NULL);
FillRect(dc, &rcClient, (HBRUSH)(COLOR_3DFACE + 1));
- DrawText(dc, _("No file selected"), -1, &rcClient,
+ DrawTextW(dc, noFileText, -1, &rcClient,
DT_CENTER | DT_VCENTER | DT_NOPREFIX);
+ g_free(noFileText);
}
else if(pImpl->_preview_bitmap != NULL)
{
NRRectL bbox = {0, 0, scaledSvgWidth, scaledSvgHeight};
// write object bbox to area
- boost::optional<NR::Rect> maybeArea(from_2geom(area));
+ Geom::OptRect maybeArea(area);
sp_document_ensure_up_to_date (svgDoc);
- sp_item_invoke_bbox((SPItem *) svgDoc->root, &maybeArea,
- sp_item_i2r_affine((SPItem *)(svgDoc->root)), TRUE);
+ sp_item_invoke_bbox((SPItem *) svgDoc->root, maybeArea,
+ sp_item_i2d_affine((SPItem *)(svgDoc->root)), TRUE);
NRArena *const arena = NRArena::create();
// Tidy up
sp_document_unref(svgDoc);
sp_item_invoke_hide((SPItem*)(svgDoc->root), key);
- nr_arena_item_unref(root);
nr_object_unref((NRObject *) arena);
// Create the GDK pixbuf
if (hmf) {
// Convert Windows Metafile to Enhanced Metafile
DWORD nSize = GetMetaFileBitsEx( hmf, 0, NULL );
-
+
if (nSize) {
BYTE *lpvData = new BYTE[nSize];
if (lpvData) {
const Glib::ustring &dir,
FileDialogType fileTypes,
const char *title,
- const Glib::ustring &/*default_key*/) :
- FileDialogBaseWin32(parent, dir, title, fileTypes, "dialogs.save_as")
+ const Glib::ustring &/*default_key*/,
+ const char *docTitle,
+ const Inkscape::Extension::FileSaveMethod save_method) :
+ FileDialogBaseWin32(parent, dir, title, fileTypes,
+ (save_method == Inkscape::Extension::FILE_SAVE_METHOD_SAVE_COPY) ? "dialogs.save_copy" : "dialogs.save_as"),
+ _title_label(NULL),
+ _title_edit(NULL)
{
+ FileSaveDialog::myDocTitle = docTitle;
createFilterMenu();
}
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = current_directory_string;
ofn.lpstrTitle = _title;
- ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLEHOOK;
ofn.lpstrFilter = _filter;
ofn.nFilterIndex = _filter_index;
+ ofn.lpfnHook = GetSaveFileName_hookproc;
+ ofn.lCustData = (LPARAM)this;
_result = GetSaveFileNameW(&ofn) != 0;
_result = false;
_main_loop = g_main_loop_new(g_main_context_default(), FALSE);
-
+
if(_main_loop != NULL)
{
if(Glib::Thread::create(sigc::mem_fun(*this, &FileSaveDialogImplWin32::GetSaveFileName_thread), true))
if(_result)
appendExtension(myFilename, (Inkscape::Extension::Output*)_extension);
}
-
+
return _result;
}
@@ -1609,11 +1666,90 @@ void FileSaveDialogImplWin32::setSelectionType( Inkscape::Extension::Extension *
}
-}
-}
+UINT_PTR CALLBACK FileSaveDialogImplWin32::GetSaveFileName_hookproc(
+ HWND hdlg, UINT uiMsg, WPARAM, LPARAM lParam)
+{
+ FileSaveDialogImplWin32 *pImpl = (FileSaveDialogImplWin32*)
+ GetWindowLongPtr(hdlg, GWLP_USERDATA);
+
+ switch(uiMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ HWND hParentWnd = GetParent(hdlg);
+ HINSTANCE hInstance = GetModuleHandle(NULL);
+
+ // get size/pos of typical combo box
+ RECT rEDT1, rCB1, rROOT, rST;
+ GetWindowRect(GetDlgItem(hParentWnd, cmb1), &rCB1);
+ GetWindowRect(GetDlgItem(hParentWnd, cmb13), &rEDT1);
+ GetWindowRect(GetDlgItem(hParentWnd, stc2), &rST);
+ GetWindowRect(hdlg, &rROOT);
+ int ydelta = rCB1.top - rEDT1.top;
+
+ // Make the window a bit longer
+ RECT rcRect;
+ GetWindowRect(hParentWnd, &rcRect);
+ MoveWindow(hParentWnd, rcRect.left, rcRect.top, rcRect.right - rcRect.left,
+ rcRect.bottom - rcRect.top + ydelta, FALSE);
+
+ // It is not necessary to delete stock objects by calling DeleteObject
+ HGDIOBJ dlgFont = GetStockObject(DEFAULT_GUI_FONT);
+
+ // Set the pointer to the object
+ OPENFILENAMEW *ofn = (OPENFILENAMEW*)lParam;
+ SetWindowLongPtr(hdlg, GWLP_USERDATA, ofn->lCustData);
+ SetWindowLongPtr(hParentWnd, GWLP_USERDATA, ofn->lCustData);
+ pImpl = (FileSaveDialogImplWin32*)ofn->lCustData;
+
+ // Create the Title label and edit control
+ pImpl->_title_label = CreateWindowEx(NULL, "STATIC", "Title:",
+ WS_VISIBLE|WS_CHILD,
+ CW_USEDEFAULT, CW_USEDEFAULT, rCB1.left-rST.left, rST.bottom-rST.top,
+ hParentWnd, NULL, hInstance, NULL);
+ if(pImpl->_title_label) {
+ if(dlgFont) SendMessage(pImpl->_title_label, WM_SETFONT, (WPARAM)dlgFont, MAKELPARAM(FALSE, 0));
+ SetWindowPos(pImpl->_title_label, NULL, rST.left-rROOT.left, rST.top+ydelta-rROOT.top,
+ rCB1.left-rST.left, rST.bottom-rST.top, SWP_SHOWWINDOW|SWP_NOZORDER);
+ }
+
+ pImpl->_title_edit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
+ WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL,
+ CW_USEDEFAULT, CW_USEDEFAULT, rCB1.right-rCB1.left, rCB1.bottom-rCB1.top,
+ hParentWnd, NULL, hInstance, NULL);
+ if(pImpl->_title_edit) {
+ if(dlgFont) SendMessage(pImpl->_title_edit, WM_SETFONT, (WPARAM)dlgFont, MAKELPARAM(FALSE, 0));
+ SetWindowPos(pImpl->_title_edit, NULL, rCB1.left-rROOT.left, rCB1.top+ydelta-rROOT.top,
+ rCB1.right-rCB1.left, rCB1.bottom-rCB1.top, SWP_SHOWWINDOW|SWP_NOZORDER);
+ // TODO: make sure this works for Unicode
+ SetWindowText(pImpl->_title_edit, pImpl->myDocTitle.c_str());
+ }
+ }
+ break;
+ case WM_DESTROY:
+ {
+ if(pImpl->_title_edit) {
+ int length = GetWindowTextLength(pImpl->_title_edit)+1;
+ char* temp_title = new char[length];
+ GetWindowText(pImpl->_title_edit, temp_title, length);
+ pImpl->myDocTitle = temp_title;
+ delete[] temp_title;
+ DestroyWindow(pImpl->_title_label);
+ pImpl->_title_label = NULL;
+ DestroyWindow(pImpl->_title_edit);
+ pImpl->_title_edit = NULL;
+ }
+ }
+ break;
+ }
+
+ // Use default dialog behaviour
+ return 0;
}
-#endif
+} } } // namespace Dialog, UI, Inkscape
+
+#endif // ifdef WIN32
/*
Local Variables:
@@ -1624,4 +1760,4 @@ void FileSaveDialogImplWin32::setSelectionType( Inkscape::Extension::Extension *
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :