JBoolean SVNWDManager::GetBrowser ( const JCharacter* path, SVNMainDirector** dir ) { *dir = NULL; JString p1; JBoolean isURL = JIsURL(path); if (isURL) { p1 = path; JAppendDirSeparator(&p1); } else if (!JGetTrueName(path, &p1)) { return kJFalse; } JPtrArray<JXWindowDirector> windowList(JPtrArrayT::kForgetAll); GetDirectors(&windowList); const JSize windowCount = windowList.GetElementCount(); JString p2, p3; for (JIndex i=1; i<=windowCount; i++) { SVNMainDirector* d = dynamic_cast<SVNMainDirector*>(windowList.NthElement(i)); if (d == NULL) { continue; } if (isURL && d->GetRepoPath(&p2)) { JAppendDirSeparator(&p2); if (p1.BeginsWith(p2)) { *dir = d; break; } } else if (!isURL && d->GetPath(&p3) && (JSameDirEntry(p1, p3) || (JGetTrueName(p3, &p2) && p1.BeginsWith(p2)))) { *dir = d; break; } } return JI2B( *dir != NULL ); }
JError JCreateDirectory ( const JCharacter* dirName, const mode_t mode ) { if (JDirectoryExists(dirName)) { return JSetPermissions(dirName, mode); } JString path = dirName; JCleanPath(&path); JAppendDirSeparator(&path); JString dir; JIndex slashIndex = 2; while (path.LocateNextSubstring("/", &slashIndex)) { dir = path.GetSubstring(1, slashIndex); if (!JDirectoryExists(dir)) { const JError err = JMkDir(dir, mode); if (!err.OK()) { return err; } } slashIndex++; // move past the slash we found } return JNoError(); }
inline JBoolean jTranslateRemoteToLocal1 ( const JCharacter* host, const JString& remotePath, const JCharacter* mountDev, const JCharacter* mountDir, JString* localPath ) { const JString dev = mountDev; JIndex hostEndIndex; if (dev.LocateSubstring(":/", &hostEndIndex) && hostEndIndex > 1) { JString h = dev.GetSubstring(1, hostEndIndex-1); jGetFullHostName(&h); JString p = dev.GetSubstring(hostEndIndex+1, dev.GetLength()); JAppendDirSeparator(&p); // force complete name when check BeginsWith() if (host == h && remotePath.BeginsWith(p)) { *localPath = remotePath; localPath->ReplaceSubstring(1, p.GetLength()-1, mountDir); JCleanPath(localPath); return kJTrue; } } return kJFalse; }
JError JDirInfo::GoTo ( const JCharacter* origDirName ) { JString dirName; if (JStringEmpty(origDirName) || !JConvertToAbsolutePath(origDirName, NULL, &dirName)) { return JBadPath(origDirName); } if (JSameDirEntry(dirName, *itsCWD)) { Update(); return JNoError(); } JAppendDirSeparator(&dirName); const JString origCWD = *itsCWD; *itsCWD = dirName; const JError err = BuildInfo(); if (err.OK()) { Broadcast(PathChanged()); } else { *itsCWD = origCWD; } return err; }
JBoolean JGetTempDirectory ( JString* tempDir ) { // inside function to keep gcc 3.3.3 (cygwin) happy static JBoolean theTempPathInitFlag = kJFalse; static JString theTempPath; if (!theTempPathInitFlag) { char* path = getenv("TMPDIR"); if (!JStringEmpty(path) && JDirectoryWritable(path)) { theTempPath = path; } else if (P_tmpdir != NULL && JDirectoryWritable(P_tmpdir)) { theTempPath = P_tmpdir; } else { theTempPath = "/tmp/"; } JAppendDirSeparator(&theTempPath); theTempPathInitFlag = kJTrue; } *tempDir = theTempPath; return kJTrue; }
void JAbsoluteToRelativePath ( const JCharacter* relativeTo, JString* path ) { JString base(relativeTo); JString test(*path); JAppendDirSeparator(&base); JAppendDirSeparator(&test); JIndex charindex = 2; JBoolean success = kJTrue; JString compare; JString store; success = test.LocateNextSubstring("/", &charindex); if (success) { compare = test.GetSubstring(1, charindex); } while (success && base.BeginsWith(compare)) { store = compare; success = test.LocateNextSubstring("/", &charindex); if (success) { compare = test.GetSubstring(1, charindex); charindex ++; } } if (test.GetLength() >= store.GetLength()) { test.RemoveSubstring(1, store.GetLength()); } if (base.GetLength() >= store.GetLength()) { base.RemoveSubstring(1, store.GetLength()); } success = base.LocateSubstring("/", &charindex); while (success) { base.RemoveSubstring(1, charindex); test.Prepend("../"); success = base.LocateSubstring("/", &charindex); } *path = test; }
JBoolean JGetHomeDirectory ( JString* homeDir ) { // try HOME environment variable char* envHomeDir = getenv("HOME"); if (envHomeDir != NULL && JDirectoryExists(envHomeDir)) { *homeDir = envHomeDir; JAppendDirSeparator(homeDir); return kJTrue; } // try password information char* envUserName = getenv("USER"); struct passwd* pw; if (envUserName != NULL) { pw = getpwnam(envUserName); } else { pw = getpwuid( getuid() ); } if (pw != NULL && JDirectoryExists(pw->pw_dir)) { *homeDir = pw->pw_dir; JAppendDirSeparator(homeDir); return kJTrue; } // give up homeDir->Clear(); return kJFalse; }
void JDirInfo::AllocateCWD ( const JCharacter* dirName ) { itsCWD = new JString; assert( itsCWD != NULL ); const JBoolean ok = JConvertToAbsolutePath(dirName, NULL, itsCWD); assert( ok ); JAppendDirSeparator(itsCWD); }
JError JDirInfo::BuildInfo() { if (!JDirectoryReadable(*itsCWD)) { return JAccessDenied(*itsCWD); } const JString origDir = JGetCurrentDirectory(); JError err = JChangeDirectory(*itsCWD); if (!err.OK()) { return err; } // clear old information itsDirEntries->CleanOut(); // update instance variables JStripTrailingDirSeparator(itsCWD); // keep Windows happy ACE_stat stbuf; ACE_OS::stat(*itsCWD, &stbuf); itsIsValidFlag = kJTrue; itsIsWritableFlag = JDirectoryWritable(*itsCWD); itsModTime = stbuf.st_mtime; itsStatusTime = stbuf.st_ctime; JAppendDirSeparator(itsCWD); // process files in the directory JLatentPG pg(itsContentRegex == NULL ? 100 : 10); if (itsPG != NULL) { pg.SetPG(itsPG, kJFalse); } pg.VariableLengthProcessBeginning("Scanning directory...", kJTrue, kJFalse); BuildInfo1(pg); pg.ProcessFinished(); err = JChangeDirectory(origDir); assert_ok( err ); ApplyFilters(kJFalse); return JNoError(); }
inline JBoolean jTranslateLocalToRemote1 ( const JString& localPath, const JCharacter* mountDev, const JCharacter* mountDir, JBoolean* found, JString* host, JString* remotePath ) { if (!JIsSamePartition(localPath, mountDir)) { return kJFalse; } const JString dev = mountDev; JIndex hostEndIndex; if (dev.LocateSubstring(":/", &hostEndIndex) && hostEndIndex > 1) { *host = dev.GetSubstring(1, hostEndIndex-1); #ifdef _J_CYGWIN if (host->GetLength() == 1 && 'A' <= host->GetFirstCharacter() && host->GetFirstCharacter() <= 'Z') { *host = JGetHostName(); *remotePath = localPath; JCleanPath(remotePath); *found = kJTrue; return kJTrue; } #endif jGetFullHostName(host); *remotePath = dev.GetSubstring(hostEndIndex+1, dev.GetLength()); JAppendDirSeparator(remotePath); // use JIndexRange to allow empty JIndexRange r(strlen(mountDir)+1, localPath.GetLength()); *remotePath += localPath.GetSubstring(r); JCleanPath(remotePath); *found = kJTrue; } return kJTrue; }
JString JXCurrentPathMenu::GetPath ( const JIndex itemIndex ) const { JString path = GetItemText(1); for (JIndex i=2; i<=itemIndex; i++) { path = JCombinePathAndName(path, GetItemText(i)); } JAppendDirSeparator(&path); return path; }
inline JString jGetName ( const JDirInfo* completer, const JIndex index ) { const JDirEntry& e = completer->GetEntry(index); JString name = e.GetName(); if (e.IsDirectory()) { JAppendDirSeparator(&name); } return name; }
JString GPrefsMgr::GetCurrentOutbox() { JString homeDir; JBoolean fileok = JGetHomeDirectory(&homeDir); JAppendDirSeparator(&homeDir); JString outbox = homeDir + ".outbox"; return outbox; std::string data; const JBoolean ok = GetData(kGCurrentOutboxID, &data); assert( ok ); std::istringstream dataStream(data); JString mbox; dataStream >> mbox; return mbox; }
JBoolean JGetHomeDirectory ( const JCharacter* user, JString* homeDir ) { struct passwd* pw = getpwnam(user); if (pw != NULL && JDirectoryExists(pw->pw_dir)) { *homeDir = pw->pw_dir; JAppendDirSeparator(homeDir); return kJTrue; } else { homeDir->Clear(); return kJFalse; } }
JString JXFileInput::GetTextForChooseFile() const { JString text = GetText(); if (text.IsEmpty() && HasBasePath()) { text = itsBasePath; JAppendDirSeparator(&text); } if (text.EndsWith(ACE_DIRECTORY_SEPARATOR_STR)) { text.AppendCharacter('*'); } if (!text.IsEmpty() && JIsRelativePath(text) && HasBasePath()) { text = JCombinePathAndName(itsBasePath, text); } return text; }
JString JGetCurrentDirectory() { char buf[1024]; char* result = getcwd(buf, 1024); JString dirName; if (result == buf) { dirName = buf; } else if (!JGetHomeDirectory(&dirName) || !(JChangeDirectory(dirName)).OK()) { dirName = JGetRootDirectory(); JChangeDirectory(dirName); } JAppendDirSeparator(&dirName); return dirName; }
GMApp::GMApp ( int* argc, char* argv[], JBoolean* displayAbout, JString* prevVersStr ) : JXApplication(argc, argv, kAppSignature, kGMDefaultStringData), itsTableDirs(NULL), itsHasFileDirectory(kJFalse), itsOpenPrefsAfterAbout(kJFalse), itsPrefsNew(kJFalse), itsAboutDialog(NULL) { *displayAbout = GMCreateGlobals(this); if (!*displayAbout) { *prevVersStr = (GGetPrefsMgr())->GetArrowVersionStr(); if (*prevVersStr == GMGetVersionNumberStr()) { prevVersStr->Clear(); } else { *displayAbout = kJTrue; if (prevVersStr->BeginsWith("1") || prevVersStr->BeginsWith("0") || prevVersStr->BeginsWith("2.0b")) { itsOpenPrefsAfterAbout = kJTrue; } } } else { itsPrefsNew = kJTrue; itsOpenPrefsAfterAbout = kJTrue; prevVersStr->Clear(); } GMMDIServer* mdi = new GMMDIServer(this); assert(mdi != NULL); itsTableDirs = new JPtrArray<GMessageTableDir>(JPtrArrayT::kForgetAll); assert(itsTableDirs != NULL); itsEditDirs = new JPtrArray<GMessageEditDir>(JPtrArrayT::kForgetAll); assert(itsEditDirs != NULL); itsLockTasks = new JPtrArray<GLockFileTask>(JPtrArrayT::kForgetAll); assert(itsLockTasks != NULL); if (*displayAbout) { if (!(JGetUserNotification())->AcceptLicense()) { exit(0); } } JString home; if (JGetHomeDirectory(&home)) { JAppendDirSeparator(&home); home += kArrowFilesDir; if (!JDirectoryExists(home)) { JError err = JCreateDirectory(home); if (err.OK()) { itsFileDirectory = home; itsHasFileDirectory = kJTrue; } } else { if (JKillDirectory(home)) { JCreateDirectory(home); } if (JDirectoryExists(home)) { itsFileDirectory = home; itsHasFileDirectory = kJTrue; } } } JBoolean ok = OpenSession(); if (*argc > 1) { mdi->HandleCmdLineOptions(*argc, argv); } else if (!ok) { OpenSystemMailbox(); } OpenMailboxWindowIfNeeded(); ListenTo(GGetPrefsMgr()); /* JString test("pulp"); JPtrArray<JString> names; GParseNameList(test, names); JPtrArray<JString> aliases; aliases.SetCompareFunction(JCompareStringsCaseSensitive); JSize i = 1; while (i <= names.GetElementCount()) { JString& name = *(names.NthElement(i)); JString alias; JString fcc; if (GGetAddressBookMgr()->NameIsAlias(name, alias, fcc)) { JIndex findex; if (!aliases.SearchSorted(&name, JOrderedSetT::kAnyMatch, &findex)) { GParseNameList(alias, names); aliases.InsertSorted(names.NthElement(i)); names.RemoveElement(i); } else { names.DeleteElement(i); } } else { i++; } } aliases.DeleteAll(); const JSize count = names.GetElementCount(); for (JIndex i = 1; i <= count; i++) { cout << *(names.NthElement(i)) << endl; }*/ }
void GPrefsMgr::UpgradeData ( const JBoolean isNew, const JFileVersion currentVersion ) { if (isNew) { JString homeDir; JBoolean fileok = JGetHomeDirectory(&homeDir); JAppendDirSeparator(&homeDir); JString outbox = homeDir + ".outbox"; SetCurrentOutbox(outbox); JString username = JGetUserName(); JString inbox = "/var/spool/mail/" + username; SetDefaultInbox(inbox); ShowStateInTitle(kJTrue); SetPopServer(JString("pop-server")); UsePopServer(kJFalse); SetLeaveOnServer(kJFalse); SetPopUserName(JString("name")); SetPopPasswd(JString("")); SetRememberPasswd(kJFalse); UseAPop(kJFalse); AutoInsertQuote(kJTrue); AutoCheckMail(kJFalse); SetCheckMailDelay(30); SetDefaultMonoFont(JGetMonospaceFontName()); JCharacter* var = getenv("REPLYTO"); if (var != NULL) { JString varStr(var); SetReplyTo(varStr); } ShowSenderString(kJTrue); SetSenderString("On $d, $f wrote:"); JXGetWebBrowser()->SetComposeMailCmd(kGMDefaultMailtoString); SetFilterFile(".procmailrc"); } else { if (currentVersion < 2) { ShowStateInTitle(kJTrue); } if (currentVersion < 3) { UseAPop(kJFalse); AutoInsertQuote(kJTrue); AutoCheckMail(kJFalse); SetCheckMailDelay(30); } if (currentVersion < 4) { JCharacter* var = getenv("REPLYTO"); if (var != NULL) { JString varStr(var); SetReplyTo(varStr); } ShowSenderString(kJTrue); SetSenderString("On $d, $f wrote:"); } if (currentVersion < 5) { RemoveData(kGHelpSetupID); JXGetWebBrowser()->SetComposeMailCmd(kGMDefaultMailtoString); } if (currentVersion < 7) { SetFilterFile(".procmailrc"); } if (currentVersion < 10) { RemoveData(42); RemoveData(45); } } }
JError JCreateTempDirectory ( const JCharacter* path, const JCharacter* prefix, JString* fullName ) { JString p; if (!JStringEmpty(path)) { p = path; } else if (!JGetTempDirectory(&p)) { return JDirEntryDoesNotExist("/tmp"); } if (!JStringEmpty(prefix)) { p = JCombinePathAndName(p, prefix); } else { p = JCombinePathAndName(p, "temp_dir_"); } p += "XXXXXX"; char* s = p.AllocateCString(); jclear_errno(); char* d = mkdtemp(s); if (d != NULL) { *fullName = s; JAppendDirSeparator(fullName); delete [] s; return JNoError(); } fullName->Clear(); delete [] s; // EINVAL counts as unexpected const int err = jerrno(); if (err == EEXIST) { return JDirEntryAlreadyExists(p); } else if (err == EFAULT) { return JSegFault(); } else if (err == EACCES) { return JAccessDenied(p); } else if (err == ENAMETOOLONG) { return JNameTooLong(); } else if (err == ENOENT) { return JBadPath(p); } else if (err == ENOTDIR) { return JComponentNotDirectory(p); } else if (err == ENOMEM) { return JNoKernelMemory(); } else if (err == EROFS) { return JFileSystemReadOnly(); } else if (err == ELOOP) { return JPathContainsLoop(p); } else if (err == ENOSPC) { return JFileSystemFull(); } else { return JUnexpectedError(err); } }
void GMApp::SaveState() { JString homeDir; if (JGetHomeDirectory(&homeDir)) { JAppendDirSeparator(&homeDir); JString session = homeDir + kStateFileName; if (JFileExists(session)) { JRemoveFile(session); } JFileArray* fileArray; JError err = JFileArray::Create(session, kStateFileSignature, &fileArray); if (!err.OK()) { if (JFileExists(session)) { JRemoveFile(session); } delete fileArray; return; } fileArray->SetVersion(kCurrentSessionVersion); JSize count; { std::ostringstream dataStream; count = itsTableDirs->GetElementCount(); dataStream << count; fileArray->AppendElement(dataStream); } JFAID_t id = 2; for (JSize i = 1; i <= count; i++) { JFileArray* embed; err = JFileArray::Create(fileArray, id, &embed); itsTableDirs->NthElement(i)->GetData()->Save(); itsTableDirs->NthElement(i)->SaveState(*embed); delete embed; id ++; } for (JSize i = itsEditDirs->GetElementCount(); i >= 1; i--) { itsEditDirs->NthElement(i)->CheckForPendingMessage(); } { std::ostringstream dataStream; count = itsEditDirs->GetElementCount(); dataStream << count; fileArray->AppendElement(dataStream); } for (JSize i = 1; i <= count; i++) { std::ostringstream dataStream; itsEditDirs->NthElement(i)->SaveState(dataStream); fileArray->AppendElement(dataStream); } { std::ostringstream dataStream; GGetInboxMgr()->SaveState(dataStream); fileArray->AppendElement(dataStream); } delete fileArray; } }
JBoolean GMApp::OpenSession() { JBoolean success = kJFalse; JString homeDir; if (JGetHomeDirectory(&homeDir)) { JAppendDirSeparator(&homeDir); JString session = homeDir + kStateFileName; if (JFileExists(session) && JFileReadable(session)) { JFileArray* fileArray; JError err = JFileArray::Create(session, kStateFileSignature, &fileArray); if (err.OK()) { JFileVersion version = fileArray->GetVersion(); if (0 < version && version <= kCurrentSessionVersion) { JFAID id = 1; JSize count; { std::string data; fileArray->GetElement(id, &data); std::istringstream is(data); is >> count; id.SetID(id.GetID() + 1); } if (count == 0) { delete fileArray; JRemoveFile(session); return kJFalse; } for (JSize i = 1; i <= count; i++) { JFileArray* embed; err = JFileArray::Create(fileArray, id, &embed); GMessageTableDir* dir; if (GMessageTableDir::Create(this, *embed, &dir, version)) { itsTableDirs->Append(dir); } id.SetID(id.GetID() + 1); delete embed; } { std::string data; fileArray->GetElement(id, &data); std::istringstream is(data); is >> count; id.SetID(id.GetID() + 1); } for (JSize i = 1; i <= count; i++) { std::string data; fileArray->GetElement(id, &data); std::istringstream is(data); GMessageEditDir* dir = new GMessageEditDir(JXGetApplication()); assert(dir != NULL); dir->ReadState(is, version); dir->Activate(); id.SetID(id.GetID() + 1); } { std::string data; fileArray->GetElement(id, &data); std::istringstream is(data); GGetInboxMgr()->ReadState(is); } success = kJTrue; }
JString JConvertToRelativePath ( const JCharacter* origPath, const JCharacter* origBase ) { // Check that they are both absolute paths. assert( origPath != NULL && origPath[0] == '/' && origBase != NULL && origBase[0] == '/' ); // Remove extra directory separators // and make sure that base ends with one. JString path = origPath; JCleanPath(&path); JString base = origBase; JCleanPath(&base); JAppendDirSeparator(&base); // Find and remove the matching directories at the beginning. // The while loop backs us up so we only consider complete directory names. JBoolean hadTDS = kJTrue; if (path.GetLastCharacter() != '/') { path.AppendCharacter('/'); hadTDS = kJFalse; } JSize matchLength = JCalcMatchLength(path, base); if (!hadTDS) { path.RemoveSubstring(path.GetLength(), path.GetLength()); } while (base.GetCharacter(matchLength) != '/') { matchLength--; } assert( matchLength >= 1 ); if (matchLength == 1) { return path; } if (matchLength > path.GetLength()) { base.RemoveSubstring(matchLength, matchLength); matchLength--; } path.RemoveSubstring(1, matchLength); base.RemoveSubstring(1, matchLength); if (base.IsEmpty()) { path.Prepend("./"); return path; } // The number of remaining directory separators in base // is the number of levels to go up. JSize upCount = 0; const JSize baseLength = base.GetLength(); for (JIndex i=1; i<=baseLength; i++) { if (base.GetCharacter(i) == '/') { upCount++; path.Prepend("../"); } } assert( upCount > 0 ); return path; }
void GMailPrefsDialog::BuildWindow ( const JBoolean showstate, const JBoolean autoQuote, const JBoolean showSender, const JString& senderString, const JString& fontname, const JSize fontsize, const JSize maxQuotedReply, const JBoolean reportSCErrors, const JSize spacesPerTab, const JBoolean beepOnNewMail, const JIndex encType, const JString& filterFile, const JString& defInbox, const JBoolean openMailboxWindow ) { // begin JXLayout JXWindow* window = new JXWindow(this, 360,550, ""); assert( window != NULL ); itsMaxReplyInput = new JXIntegerInput(window, JXWidget::kHElastic, JXWidget::kVElastic, 270,335, 40,20); assert( itsMaxReplyInput != NULL ); itsSenderStringInput = new JXInputField(window, JXWidget::kHElastic, JXWidget::kVElastic, 100,385, 240,20); assert( itsSenderStringInput != NULL ); itsSpacesPerTabInput = new JXIntegerInput(window, JXWidget::kHElastic, JXWidget::kVElastic, 140,80, 40,20); assert( itsSpacesPerTabInput != NULL ); JXTextButton* okButton = new JXTextButton(JGetString("okButton::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 260,515, 70,20); assert( okButton != NULL ); okButton->SetShortcuts(JGetString("okButton::GMailPrefsDialog::shortcuts::JXLayout")); JXTextButton* cancelButton = new JXTextButton(JGetString("cancelButton::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 30,515, 70,20); assert( cancelButton != NULL ); cancelButton->SetShortcuts(JGetString("cancelButton::GMailPrefsDialog::shortcuts::JXLayout")); itsShowStateInTitle = new JXTextCheckbox(JGetString("itsShowStateInTitle::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,310, 250,20); assert( itsShowStateInTitle != NULL ); itsAutoQuote = new JXTextCheckbox(JGetString("itsAutoQuote::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,335, 250,20); assert( itsAutoQuote != NULL ); itsShowSenderString = new JXTextCheckbox(JGetString("itsShowSenderString::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,360, 250,20); assert( itsShowSenderString != NULL ); itsSenderText = new JXStaticText(JGetString("itsSenderText::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 50,385, 50,20); assert( itsSenderText != NULL ); itsSenderText->SetToLabel(); itsHelpButton = new JXTextButton(JGetString("itsHelpButton::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 145,515, 70,20); assert( itsHelpButton != NULL ); itsFontMenu = new JXChooseMonoFont(window, JXWidget::kHElastic, JXWidget::kVElastic, 20,10, 310,60); assert( itsFontMenu != NULL ); JXStaticText* obj1_JXLayout = new JXStaticText(JGetString("obj1_JXLayout::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 315,335, 30,20); assert( obj1_JXLayout != NULL ); obj1_JXLayout->SetToLabel(); itsReportSCErrorsCB = new JXTextCheckbox(JGetString("itsReportSCErrorsCB::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,420, 250,20); assert( itsReportSCErrorsCB != NULL ); JXStaticText* obj2_JXLayout = new JXStaticText(JGetString("obj2_JXLayout::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 40,80, 100,20); assert( obj2_JXLayout != NULL ); obj2_JXLayout->SetToLabel(); itsBeepOnNewMailCB = new JXTextCheckbox(JGetString("itsBeepOnNewMailCB::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,285, 250,20); assert( itsBeepOnNewMailCB != NULL ); itsEncryptionType = new JXRadioGroup(window, JXWidget::kHElastic, JXWidget::kVElastic, 45,175, 145,70); assert( itsEncryptionType != NULL ); JXTextRadioButton* obj3_JXLayout = new JXTextRadioButton(1, JGetString("obj3_JXLayout::GMailPrefsDialog::JXLayout"), itsEncryptionType, JXWidget::kHElastic, JXWidget::kVElastic, 20,15, 100,20); assert( obj3_JXLayout != NULL ); JXTextRadioButton* obj4_JXLayout = new JXTextRadioButton(2, JGetString("obj4_JXLayout::GMailPrefsDialog::JXLayout"), itsEncryptionType, JXWidget::kHElastic, JXWidget::kVElastic, 20,35, 100,20); assert( obj4_JXLayout != NULL ); JXStaticText* obj5_JXLayout = new JXStaticText(JGetString("obj5_JXLayout::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 55,168, 120,20); assert( obj5_JXLayout != NULL ); obj5_JXLayout->SetToLabel(); JXStaticText* obj6_JXLayout = new JXStaticText(JGetString("obj6_JXLayout::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,480, 90,20); assert( obj6_JXLayout != NULL ); obj6_JXLayout->SetToLabel(); itsFilterButton = new JXTextButton(JGetString("itsFilterButton::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 290,480, 60,20); assert( itsFilterButton != NULL ); itsDefaultInbox = new JXFileInput(window, JXWidget::kHElastic, JXWidget::kVElastic, 110,450, 180,20); assert( itsDefaultInbox != NULL ); itsInboxButton = new JXTextButton(JGetString("itsInboxButton::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kFixedTop, 290,450, 60,20); assert( itsInboxButton != NULL ); JXStaticText* obj7_JXLayout = new JXStaticText(JGetString("obj7_JXLayout::GMailPrefsDialog::JXLayout"), window, JXWidget::kFixedLeft, JXWidget::kFixedTop, 20,450, 90,20); assert( obj7_JXLayout != NULL ); obj7_JXLayout->SetToLabel(); itsFilterFileInput = new JXFileInput(window, JXWidget::kHElastic, JXWidget::kVElastic, 110,480, 180,20); assert( itsFilterFileInput != NULL ); itsCopySelectedCB = new JXTextCheckbox(JGetString("itsCopySelectedCB::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,110, 270,20); assert( itsCopySelectedCB != NULL ); itsHomeEndCB = new JXTextCheckbox(JGetString("itsHomeEndCB::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,135, 270,20); assert( itsHomeEndCB != NULL ); itsOpenMailTreeCB = new JXTextCheckbox(JGetString("itsOpenMailTreeCB::GMailPrefsDialog::JXLayout"), window, JXWidget::kHElastic, JXWidget::kVElastic, 20,260, 250,20); assert( itsOpenMailTreeCB != NULL ); // end JXLayout window->SetTitle("Mail Preferences"); SetButtons(okButton, cancelButton); ListenTo(itsShowSenderString); ListenTo(itsHelpButton); ListenTo(itsAutoQuote); itsShowStateInTitle->SetState(showstate); itsAutoQuote->SetState(autoQuote); itsSenderStringInput->SetText(senderString); itsShowSenderString->SetState(showSender); itsFontMenu->SetFont(fontname, fontsize); itsMaxReplyInput->SetValue(maxQuotedReply); itsSpacesPerTabInput->SetValue(spacesPerTab); itsReportSCErrorsCB->SetState(reportSCErrors); itsBeepOnNewMailCB->SetState(beepOnNewMail); itsOpenMailTreeCB->SetState(openMailboxWindow); AdjustForSenderString(showSender); AdjustForQuotedReply(autoQuote); itsEncryptionType->SelectItem(encType); JString home; if (JGetHomeDirectory(&home)) { JAppendDirSeparator(&home); itsDefaultInbox->SetBasePath(home); itsFilterFileInput->SetBasePath(home); } itsDefaultInbox->SetText(defInbox); itsDefaultInbox->ShouldAllowInvalidFile(); ListenTo(itsInboxButton); itsFilterFileInput->SetText(filterFile); itsFilterFileInput->ShouldAllowInvalidFile(); ListenTo(itsFilterButton); itsCopySelectedCB->SetState(JTextEditor::WillCopyWhenSelect()); itsHomeEndCB->SetState(JXTEBase::WillUseWindowsHomeEnd()); }
JBoolean JXPathInput::Complete ( JXInputField* te, const JCharacter* basePath, // can be NULL JDirInfo* completer, JXStringCompletionMenu** menu // constructed if NULL ) { // only complete if caret is at end of text JIndex caretIndex; if (!te->GetCaretLocation(&caretIndex) || caretIndex != te->GetTextLength()+1) { return kJFalse; } // catch empty path if (te->IsEmpty()) { const JString path = JGetRootDirectory(); te->Paste(path); return kJTrue; } // convert to absolute path JString fullName; if (!JExpandHomeDirShortcut(te->GetText(), &fullName)) { return kJFalse; } if (JIsRelativePath(fullName)) { if (JStringEmpty(basePath)) { return kJFalse; } fullName = JCombinePathAndName(basePath, fullName); } // if completing ~ rather than ~/ if (fullName.EndsWith(ACE_DIRECTORY_SEPARATOR_STR) && !(te->GetText()).EndsWith(ACE_DIRECTORY_SEPARATOR_STR)) { JStripTrailingDirSeparator(&fullName); } // get path and wildcard filter JString path, name; if (fullName.EndsWith(ACE_DIRECTORY_SEPARATOR_STR)) { path = fullName; name = "*"; } else { JSplitPathAndName(fullName, &path, &name); name.AppendCharacter('*'); } // build completion list if (!(completer->GoTo(path)).OK()) { return kJFalse; } completer->SetWildcardFilter(name, kJFalse, kJTrue); if (completer->IsEmpty()) { return kJFalse; } // check for characters common to all matches JString maxPrefix = jGetFullName(completer, 1); const JSize matchCount = completer->GetEntryCount(); JString entryName; for (JIndex i=2; i<=matchCount; i++) { entryName = jGetFullName(completer, i); const JSize matchLength = JCalcMatchLength(maxPrefix, entryName); const JSize prefixLength = maxPrefix.GetLength(); if (matchLength < prefixLength) { maxPrefix.RemoveSubstring(matchLength+1, prefixLength); } } // use the completion list if (matchCount > 0 && maxPrefix.GetLength() > fullName.GetLength()) { maxPrefix.RemoveSubstring(1, fullName.GetLength()); if (matchCount == 1 && (completer->GetEntry(1)).IsDirectory()) { JAppendDirSeparator(&maxPrefix); } te->Paste(maxPrefix); // so Undo removes completion if (*menu != NULL) { (**menu).ClearRequestCount(); } return kJTrue; } else if (matchCount > 1) { if (*menu == NULL) { *menu = new JXStringCompletionMenu(te, kJFalse); assert( *menu != NULL ); } else { (**menu).RemoveAllItems(); } for (JIndex i=1; i<=matchCount; i++) { entryName = jGetName(completer, i); (**menu).AddString(entryName); } (**menu).CompletionRequested(name.GetLength()-1); return kJTrue; } else { return kJFalse; } }
JString JGetClosestDirectory ( const JCharacter* origDirName, const JBoolean requireWrite, const JCharacter* basePath ) { assert( !JStringEmpty(origDirName) ); JString workingDir; if (!JStringEmpty(basePath)) { workingDir = basePath; JAppendDirSeparator(&workingDir); } else { workingDir = JGetCurrentDirectory(); } JString dirName = origDirName; JString homeDir; JSize homeLength; if (origDirName[0] == '~' && !JExpandHomeDirShortcut(origDirName, &dirName, &homeDir, &homeLength)) { return JGetRootDirectory(); } else if (JIsRelativePath(origDirName)) { dirName.Prepend(workingDir); } assert( !JIsRelativePath(dirName) ); JString newDir, junkName; while (!JDirectoryExists(dirName) || !JCanEnterDirectory(dirName) || !JDirectoryReadable(dirName) || (requireWrite && !JDirectoryWritable(dirName))) { JStripTrailingDirSeparator(&dirName); if (JIsRootDirectory(dirName)) { break; } JSplitPathAndName(dirName, &newDir, &junkName); dirName = newDir; } // convert back to partial path, if possible if (origDirName[0] == '~' && dirName.BeginsWith(homeDir)) { dirName.ReplaceSubstring(1, homeDir.GetLength(), origDirName, homeLength); } else if (JIsRelativePath(origDirName) && dirName.GetLength() > workingDir.GetLength() && dirName.BeginsWith(workingDir)) { dirName.RemoveSubstring(1, workingDir.GetLength()); } return dirName; }