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 );
}
Пример #2
0
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;
}
Пример #5
0
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;
}
Пример #7
0
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;
}
Пример #11
0
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;
}
Пример #12
0
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;
}
Пример #14
0
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;
		}
}
Пример #15
0
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;
}
Пример #16
0
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;
}
Пример #17
0
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);
			}
		}
}
Пример #19
0
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);
		}
}
Пример #20
0
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;
		}
}
Пример #21
0
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;
					}
Пример #22
0
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());
}
Пример #24
0
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;
		}
}
Пример #25
0
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;
}