/* AbiWord * Copyright (C) 2000 AbiSource, Inc. * * 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., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include #include #include #include "ut_string.h" #include "ut_assert.h" #include "ut_debugmsg.h" #include "ut_path.h" #include "xap_App.h" #include "xap_QNXApp.h" #include "xap_QNXFrameImpl.h" #include "xap_Frame.h" #include "ap_Strings.h" #include "ap_Dialog_Id.h" #include "ap_Dialog_New.h" #include "ap_QNXDialog_New.h" #include "ut_qnxHelper.h" #include "xap_Dlg_FileOpenSaveAs.h" #include "ie_imp.h" /*************************************************************************/ XAP_Dialog * AP_QNXDialog_New::static_constructor(XAP_DialogFactory * pFactory, XAP_Dialog_Id id) { AP_QNXDialog_New * p = new AP_QNXDialog_New(pFactory,id); return p; } AP_QNXDialog_New::AP_QNXDialog_New(XAP_DialogFactory * pDlgFactory, XAP_Dialog_Id id) : AP_Dialog_New(pDlgFactory,id), m_pFrame(0) { } AP_QNXDialog_New::~AP_QNXDialog_New(void) { UT_VECTOR_PURGEALL(UT_String*, mTemplates); } void AP_QNXDialog_New::runModal(XAP_Frame * pFrame) { UT_ASSERT(pFrame); m_pFrame = pFrame; XAP_QNXFrameImpl * pQNXFrameImpl = (XAP_QNXFrameImpl*)pFrame->getFrameImpl(); PtWidget_t *parentWindow = pQNXFrameImpl->getTopLevelWindow(); UT_ASSERT(parentWindow); PtSetParentWidget(parentWindow); // Build the window's widgets and arrange them PtWidget_t * mainWindow = _constructWindow(); UT_ASSERT(mainWindow); connectFocus(mainWindow, pFrame); UT_QNXCenterWindow(parentWindow, mainWindow); UT_QNXBlockWidget(parentWindow, 1); PtRealizeWidget(mainWindow); int count; count = PtModalStart(); done = 0; while(!done) { PtProcessEvent(); } PtModalEnd(MODAL_END_ARG(count)); UT_QNXBlockWidget(parentWindow, 0); PtDestroyWidget(mainWindow); } /*************************************************************************/ /*************************************************************************/ void AP_QNXDialog_New::event_Ok () { char *name; int *flags; setAnswer (AP_Dialog_New::a_OK); if (PtGetResource(m_radioExisting, Pt_ARG_FLAGS, &flags, 0) == 0 && *flags & Pt_SET) { setOpenType(AP_Dialog_New::open_Existing); //Not in unix version PtGetResource(m_entryFilename, Pt_ARG_TEXT_STRING, &name, NULL); setFileName(name); } else if (PtGetResource(m_radioNew, Pt_ARG_FLAGS, &flags, 0) == 0 && *flags & Pt_SET) { unsigned short *num; PtGetResource(m_list,Pt_ARG_SELECTION_INDEXES,&num,0); UT_String * tmpl = (UT_String*)mTemplates[*num-1] ; if(tmpl && tmpl->c_str()) { setFileName(tmpl->c_str()); setOpenType(AP_Dialog_New::open_Template); } } else { setOpenType(AP_Dialog_New::open_New); } done++; } void AP_QNXDialog_New::event_Cancel () { if(!done++) { setAnswer (AP_Dialog_New::a_CANCEL); } } void AP_QNXDialog_New::event_ToggleUseTemplate (const char * name) { setFileName(name); // setTemplateName (name); XXX: correct or not? } void AP_QNXDialog_New::event_ToggleOpenExisting () { XAP_Dialog_Id id = XAP_DIALOG_ID_FILE_OPEN; XAP_DialogFactory * pDialogFactory = (XAP_DialogFactory *) m_pFrame->getDialogFactory(); XAP_Dialog_FileOpenSaveAs * pDialog = (XAP_Dialog_FileOpenSaveAs *)(pDialogFactory->requestDialog(id)); UT_ASSERT(pDialog); pDialog->setCurrentPathname(0); pDialog->setSuggestFilename(false); UT_uint32 filterCount = IE_Imp::getImporterCount(); const char ** szDescList = (const char **) UT_calloc(filterCount + 1, sizeof(char *)); const char ** szSuffixList = (const char **) UT_calloc(filterCount + 1, sizeof(char *)); IEFileType * nTypeList = (IEFileType *) UT_calloc(filterCount + 1, sizeof(IEFileType)); UT_uint32 k = 0; while (IE_Imp::enumerateDlgLabels(k, &szDescList[k], &szSuffixList[k], &nTypeList[k])) k++; pDialog->setFileTypeList(szDescList, szSuffixList, (const UT_sint32 *) nTypeList); pDialog->setDefaultFileType(IE_Imp::fileTypeForSuffix(".abw")); pDialog->runModal(m_pFrame); XAP_Dialog_FileOpenSaveAs::tAnswer ans = pDialog->getAnswer(); bool bOK = (ans == XAP_Dialog_FileOpenSaveAs::a_OK); if (bOK) { const char * szResultPathname = pDialog->getPathname(); if (szResultPathname && *szResultPathname) { // update the entry box PtSetResource(m_radioExisting,Pt_ARG_FLAGS,Pt_TRUE,Pt_SET); PtSetResource(m_entryFilename, Pt_ARG_TEXT_STRING, szResultPathname, NULL); setFileName (szResultPathname); } } FREEP(szDescList); FREEP(szSuffixList); FREEP(nTypeList); pDialogFactory->releaseDialog(pDialog); } void AP_QNXDialog_New::event_ToggleStartNew () { // nada } void AP_QNXDialog_New::event_ToggleSelection(PtWidget_t *w) { if(m_radioNew != w) { PtSetResource(m_radioNew, Pt_ARG_FLAGS, 0, Pt_SET); } if(m_radioExisting != w) { PtSetResource(m_radioExisting, Pt_ARG_FLAGS, 0, Pt_SET); } if(m_radioEmpty != w) { PtSetResource(m_radioEmpty, Pt_ARG_FLAGS, 0, Pt_SET); } } void AP_QNXDialog_New::event_ListClicked() { if((PtWidgetFlags(m_radioNew) & Pt_SET)) return; else PtSetResource(m_radioNew,Pt_ARG_FLAGS,Pt_TRUE,Pt_SET); return; } /*************************************************************************/ /*************************************************************************/ int s_ok_clicked (PtWidget_t *w, void *data, PtCallbackInfo_t *info) { AP_QNXDialog_New * dlg = (AP_QNXDialog_New *)data; UT_ASSERT(dlg); dlg->event_Ok(); return Pt_CONTINUE; } int s_cancel_clicked (PtWidget_t *w, void *data, PtCallbackInfo_t *info) { AP_QNXDialog_New * dlg = (AP_QNXDialog_New *)data; UT_ASSERT(dlg); dlg->event_Cancel(); return Pt_CONTINUE; } int s_choose_clicked (PtWidget_t *w, void *data, PtCallbackInfo_t *info) { AP_QNXDialog_New * dlg = (AP_QNXDialog_New *)data; dlg->event_ToggleOpenExisting(); return Pt_CONTINUE; } int s_radio_clicked(PtWidget_t *w, void *data, PtCallbackInfo_t *info) { AP_QNXDialog_New * dlg = (AP_QNXDialog_New *)data; dlg->event_ToggleSelection(w); return Pt_CONTINUE; } int s_list_clicked(PtWidget_t *w,void *data,PtCallbackInfo_t *info) { AP_QNXDialog_New *dlg = (AP_QNXDialog_New*)data; dlg->event_ListClicked(); return Pt_CONTINUE; } /*************************************************************************/ /*************************************************************************/ //From GTK. static int awt_only (struct dirent *d) { const char * name = d->d_name; if ( name ) { int len = strlen (name); if (len >= 4) { if(!strcmp(name+(len-4), ".awt") || !strcmp(name+(len-4), ".dot") ) return 1; } } return 0; } PtWidget_t * AP_QNXDialog_New::_constructWindow () { PtWidget_t *mainWindow; PtWidget_t *hgroup, *vgroup; PtArg_t args[10]; int n; const XAP_StringSet * pSS = m_pApp->getStringSet(); n = 0; UT_UTF8String s; pSS->getValueUTF8(AP_STRING_ID_DLG_NEW_Title,s); PtSetArg(&args[n++], Pt_ARG_WINDOW_TITLE, s.utf8_str(), 0); PtSetArg(&args[n++], Pt_ARG_WINDOW_RENDER_FLAGS, 0, ABI_MODAL_WINDOW_RENDER_FLAGS); PtSetArg(&args[n++], Pt_ARG_WINDOW_MANAGED_FLAGS, 0, ABI_MODAL_WINDOW_MANAGE_FLAGS); PtSetArg(&args[n++], Pt_ARG_WIDTH, 200, 0); mainWindow = PtCreateWidget(PtWindow, NULL, n, args); SetupContextHelp(mainWindow,this); PtAddHotkeyHandler(mainWindow,Pk_F1,0,Pt_HOTKEY_SYM,this,OpenHelp); PtAddCallback(mainWindow, Pt_CB_WINDOW_CLOSING, s_cancel_clicked, this); n = 0; PtSetArg(&args[n++], Pt_ARG_GROUP_ORIENTATION, Pt_GROUP_VERTICAL, 0); PtSetArg(&args[n++], Pt_ARG_MARGIN_WIDTH, ABI_MODAL_MARGIN_SIZE, 0); PtSetArg(&args[n++], Pt_ARG_MARGIN_HEIGHT, ABI_MODAL_MARGIN_SIZE, 0); PtSetArg(&args[n++], Pt_ARG_GROUP_SPACING_Y, 5, 0); PtSetArg(&args[n++], Pt_ARG_GROUP_FLAGS, Pt_GROUP_EXCLUSIVE, Pt_GROUP_EXCLUSIVE); PtSetArg(&args[n++], Pt_ARG_RESIZE_FLAGS, Pt_RESIZE_XY_AS_REQUIRED, Pt_RESIZE_XY_AS_REQUIRED | Pt_RESIZE_XY_ALWAYS); vgroup = PtCreateWidget(PtGroup, mainWindow, n, args); /* New Document from Template */ n = 0; PtSetArg(&args[n++], Pt_ARG_GROUP_ROWS_COLS, 1, 0); PtSetArg(&args[n++], Pt_ARG_GROUP_FLAGS, Pt_GROUP_EQUAL_SIZE_HORIZONTAL, Pt_GROUP_EQUAL_SIZE_HORIZONTAL); hgroup = PtCreateWidget(PtGroup, vgroup, n, args); n = 0; PtSetArg(&args[n++], Pt_ARG_INDICATOR_TYPE, Pt_TOGGLE_RADIO, 0); pSS->getValueUTF8(AP_STRING_ID_DLG_NEW_Create,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), NULL); PtSetArg(&args[n++], Pt_ARG_FLAGS,Pt_TRUE,Pt_CALLBACKS_ACTIVE); m_radioNew = PtCreateWidget(PtToggleButton, hgroup, n, args); PtAddCallback(m_radioNew, Pt_CB_ACTIVATE, s_radio_clicked, this); //Others do this in a tab ... I think a tree is better //PtList is the best. n = 0; PtSetArg(&args[n++], Pt_ARG_HEIGHT, 100, 0); m_list = PtCreateWidget(PtList, hgroup, n, args); PtAddCallback(m_list,Pt_CB_SELECTION,s_list_clicked,this); //Fill the list with the availible templates. UT_String templateList[2]; UT_String templateDir; // the locally installed templates (per-user basis) templateDir = XAP_App::getApp()->getUserPrivateDirectory(); templateDir += "/templates/"; templateList[0] = templateDir; // the globally installed templates templateDir = XAP_App::getApp()->getAbiSuiteLibDir(); templateDir += "/templates/"; templateList[1] = templateDir; for ( unsigned int i = 0; i < (sizeof(templateList)/sizeof(templateList[0])); i++ ) { struct direct **namelist = NULL; UT_sint32 n = 0; templateDir = templateList[i]; n = scandir((char*)templateDir.c_str(), &namelist, awt_only, alphasort); if (n > 0) { while(n-- > 0) { UT_String myTemplate (templateDir + namelist[n]->d_name); UT_String * myTemplateCopy = new UT_String ( myTemplate ) ; mTemplates.addItem ( myTemplateCopy ) ; myTemplate = myTemplate.substr ( 0, myTemplate.size() - 4 ) ; char * txt[1]; txt[0] = (char*)UT_basename ( myTemplate.c_str() ); PtListAddItems(m_list,(const char **)txt,1,0); free (namelist[n]); } } } /* Open Existing Document */ n = 0; PtSetArg(&args[n++], Pt_ARG_GROUP_ROWS_COLS, 1, 0); PtSetArg(&args[n++], Pt_ARG_GROUP_FLAGS, Pt_GROUP_EQUAL_SIZE_HORIZONTAL, Pt_GROUP_EQUAL_SIZE_HORIZONTAL); hgroup = PtCreateWidget(PtGroup, vgroup, n, args); n = 0; PtSetArg(&args[n++], Pt_ARG_INDICATOR_TYPE, Pt_TOGGLE_RADIO, 0); pSS->getValueUTF8(AP_STRING_ID_DLG_NEW_Open,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), NULL); PtSetArg(&args[n++], Pt_ARG_FLAGS,Pt_TRUE,Pt_CALLBACKS_ACTIVE); m_radioExisting = PtCreateWidget(PtToggleButton, hgroup, n, args); PtAddCallback(m_radioExisting, Pt_CB_ACTIVATE, s_radio_clicked, this); n = 0; PtWidget_t *hgroup2 = PtCreateWidget(PtGroup, hgroup, n, args); n = 0; PtSetArg(&args[n++], Pt_ARG_WIDTH, 2*ABI_DEFAULT_BUTTON_WIDTH, 0); pSS->getValueUTF8(AP_STRING_ID_DLG_NEW_NoFile,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), NULL); m_entryFilename = PtCreateWidget(PtText, hgroup2, n, args); n = 0; PtSetArg(&args[n++], Pt_ARG_WIDTH, ABI_DEFAULT_BUTTON_WIDTH, 0); pSS->getValueUTF8(AP_STRING_ID_DLG_NEW_Choose,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), NULL); PtWidget_t *choose = PtCreateWidget(PtButton, hgroup2, n, args); PtAddCallback(choose, Pt_CB_ACTIVATE, s_choose_clicked, this); /* Start w/ Empty Document */ n = 0; hgroup = PtCreateWidget(PtGroup, vgroup, n, args); n = 0; PtSetArg(&args[n++], Pt_ARG_INDICATOR_TYPE, Pt_TOGGLE_RADIO, 0); PtSetArg(&args[n++], Pt_ARG_FLAGS, Pt_SET|Pt_CALLBACKS_ACTIVE, Pt_SET|Pt_CALLBACKS_ACTIVE); pSS->getValueUTF8(AP_STRING_ID_DLG_NEW_StartEmpty,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), NULL); m_radioEmpty = PtCreateWidget(PtToggleButton, hgroup, n, args); PtAddCallback(m_radioEmpty, Pt_CB_ACTIVATE, s_radio_clicked, this); /* Bottom row of buttons */ n = 0; hgroup = PtCreateWidget(PtGroup, vgroup, n, args); n = 0; pSS->getValueUTF8(XAP_STRING_ID_DLG_Cancel,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), 0); PtSetArg(&args[n++], Pt_ARG_WIDTH, ABI_DEFAULT_BUTTON_WIDTH, 0); PtWidget_t *buttonCancel = PtCreateWidget(PtButton, hgroup, n, args); PtAddCallback(buttonCancel, Pt_CB_ACTIVATE, s_cancel_clicked, this); n = 0; pSS->getValueUTF8(XAP_STRING_ID_DLG_OK,s); PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, s.utf8_str(), 0); PtSetArg(&args[n++], Pt_ARG_WIDTH, ABI_DEFAULT_BUTTON_WIDTH, 0); PtWidget_t *buttonOK = PtCreateWidget(PtButton, hgroup, n, args); PtAddCallback(buttonOK, Pt_CB_ACTIVATE, s_ok_clicked, this); // assign pointers to widgets m_mainWindow = mainWindow; m_buttonOk = buttonOK; m_buttonCancel = buttonCancel; return mainWindow; }