Exemplo n.º 1
0
void
BAboutWindow::AddText(const char* header, const char** contents)
{
	BTextView* infoView = fAboutView->InfoView();
	int32 textLength = infoView->TextLength();
	BString text("");

	if (textLength > 0) {
		text << "\n\n";
		textLength += 2;
	}

	const char* indent = "";
	if (header != NULL) {
		indent = "    ";
		text << header;
	}

	if (contents != NULL) {
		text << "\n";
		for (int32 i = 0; contents[i]; i++)
			text << indent << contents[i] << "\n";
	}

	infoView->Insert(text.String());

	if (contents != NULL && header != NULL) {
		infoView->SetFontAndColor(textLength, textLength + strlen(header),
			be_bold_font);
	}
}
Exemplo n.º 2
0
void
StringEditor::CommitChanges()
{
	if (fPreviousText != fTextView->Text()) {
		fEditor.Replace(0, (const uint8 *)fTextView->Text(),
			fTextView->TextLength() + 1);
	}
}
Exemplo n.º 3
0
/***********************************************************
 * HardWrap
 ***********************************************************/
void
HWrapTextView::GetHardWrapedText(BString &out)
{
	MakeEditable(false);
	
	BTextView *offview = new BTextView(Bounds(),NULL,TextRect(),B_FOLLOW_ALL);
	offview->SetText(Text());
	
	BFont font;
	uint32 propa;
	GetFontAndColor(&font,&propa);
	out = "";
	offview->SetFontAndColor(&font,B_FONT_ALL);
	BString line;
	int32 length = offview->TextLength();
	float view_width = offview->TextRect().Width();
	char c=0;
	bool inserted;
	
	for(int32 i=0;i < length;i++)
	{
		c = offview->ByteAt(i);
		if(c == '\n')
		{
			line = "";
			continue;
		}
		line += c;
		if(font.StringWidth(line.String())>=view_width)
		{
			// Back 1 charactor.
			i--;
			line.Truncate(line.Length()-1);
			// Insert line break.
			inserted = false;
			int32 len = line.Length();
			for(int32 k = 0;k<len;k++)
			{
				if(offview->CanEndLine(i-k))
				{
					offview->Insert(i-k,"\n",1);
					inserted=true;
					i = i-k;
					break;
				}
			}
			// If could not find proper position, add line break to end.
			if(!inserted)
				offview->Insert(i,"\n",1);
			line = "";
		}
	}
	out = offview->Text();
	
	delete offview;
	MakeEditable(true);
}
Exemplo n.º 4
0
void
PersonView::SetAttribute(const char* attribute, const char* value,
	bool update)
{
	if (!LockLooper())
		return;

	AttributeTextControl* control = NULL;
	for (int32 i = fControls.CountItems() - 1; i >= 0; i--) {
		if (fControls.ItemAt(i)->Attribute() == attribute) {
			control = fControls.ItemAt(i);
			break;
		}
	}

	if (control == NULL)
		return;

	if (update) {
		control->SetText(value);
		control->Update();
	} else {
		BTextView* text = control->TextView();

		int32 start, end;
		text->GetSelection(&start, &end);
		if (start != end) {
			text->Delete();
			text->Insert(value);
		} else if ((end = text->TextLength())) {
			text->Select(end, end);
			text->Insert(",");
			text->Insert(value);
			text->Select(text->TextLength(), text->TextLength());
		} else
			control->SetText(value);
	}

	UnlockLooper();
}
Exemplo n.º 5
0
/***********************************************************
 * ChangeAccount
 ***********************************************************/
void
HAddressView::ChangeAccount(const char* name)
{
	BPath path;
	::find_directory(B_USER_SETTINGS_DIRECTORY,&path);
	path.Append(APP_NAME);
	path.Append("Accounts");
	path.Append(name);
	
	BFile file(path.Path(),B_READ_ONLY);
	if(file.InitCheck() == B_OK)
	{
		BMessage msg;
		msg.Unflatten(&file);
		BString name,from,address;
		
		if(msg.FindString("real_name",&name) != B_OK)
			name = "";
		if(msg.FindString("address",&address) != B_OK)
		{
			address = "";
			(new BAlert("",_("Cound not find your email address!\nPlease check your account"),_("OK")))->Go();
			return;
		}
		if(name.Length() > 0)
			from << "\"" <<name << "\" <";
		from += address;
		
		if(name.Length() > 0)
			from << ">";
		fFrom->SetText(from.String());
		// Insert signature.
		BTextView *view = cast_as(Window()->FindView("HMailView"),BTextView);
		if(view)
		{	
			const char* sig_path;
			if(msg.FindString("signature",&sig_path) == B_OK)
			{
				BFile sigfile(sig_path,B_READ_ONLY);
				if(sigfile.InitCheck() == B_OK)
				{
					BString str;
					str << "\n" << sigfile;
					view->Insert(view->TextLength(),str.String(),str.Length());
					view->Select(0,0);
				}
			}
		}
	}
}
Exemplo n.º 6
0
void
PersonView::MessageReceived(BMessage* msg)
{
	switch (msg->what) {
		case M_SAVE:
			Save();
			break;

		case M_REVERT:
			if (fPictureView)
				fPictureView->Revert();

			if (fAddrView)
				fAddrView->Reload();

			for (int32 i = fControls.CountItems() - 1; i >= 0; i--)
				fControls.ItemAt(i)->Reload();
			break;

		case M_SELECT:
			for (int32 i = fControls.CountItems() - 1; i >= 0; i--) {
				BTextView* text = fControls.ItemAt(i)->TextView();
				if (text->IsFocus()) {
					text->Select(0, text->TextLength());
					break;
				}
			}
			break;

		case M_GROUP_MENU:
		{
			/*const char* name = NULL;
			if (msg->FindString("group", &name) == B_OK)
				SetAttribute(fCategoryAttribute, name, false);*/
			break;
		}

	}
}
void
PersonView::MessageReceived(BMessage* msg)
{
	msg->PrintToStream();
	switch (msg->what) {
		case M_SAVE:
			Save();
			break;

		case M_REVERT:
			if (fPictureView)
				fPictureView->Revert();

			if (fAddressWindow)
				fAddressWindow->Reload();

			for (int32 i = fControls.CountItems() - 1; i >= 0; i--)
				fControls.ItemAt(i)->Reload();
			break;

		case M_SELECT:
			for (int32 i = fControls.CountItems() - 1; i >= 0; i--) {
				BTextView* text = fControls.ItemAt(i)->TextView();
				if (text->IsFocus()) {
					text->Select(0, text->TextLength());
					break;
				}
			}
			break;

		case M_GROUP_MENU:
		{
			/*const char* name = NULL;
			if (msg->FindString("group", &name) == B_OK)
				SetAttribute(fCategoryAttribute, name, false);*/
			break;
		}

		case M_SHOW_LOCATIONS:
		{
			if (fAddressWindow == NULL) {
				fAddressWindow = new AddressWindow(fContact);
			}
			fAddressWindow->Show();
			fAddressWindow->Activate(true);
			break;
		}

		case M_ADD_FIELD:
		{
			field_type type;
			if (msg->FindInt32("field_type", (int32*)&type) == B_OK) {
				BContactField* contactField 
					= BContactField::InstantiateChildClass(type);
				fContact->AddField(contactField);
				AddNewField(contactField);
				fSaved = false;
			}
			break;
		}

		case M_REMOVE_FIELD:
		{
			ContactFieldTextControl* control;
			if (msg->FindPointer("fieldtextcontrol",
				(void**)&control) == B_OK) {
				_RemoveField(control);
				fSaved = false;
			}
			break;
		}
	}
}
Exemplo n.º 8
0
status_t
PTextView::GetProperty(const char *name, PValue *value, const int32 &index) const
{
	if (!name || !value)
		return B_ERROR;
	
	BString str(name);
	PProperty *prop = FindProperty(name,index);
	if (!prop)
		return B_NAME_NOT_FOUND;
	
	BTextView *backend = (BTextView*)fView;

	if (backend->Window())
		backend->Window()->Lock();

	if (str.ICompare("LineCount") == 0)
		((IntProperty*)prop)->SetValue(backend->CountLines());
	else if (str.ICompare("Selectable") == 0)
		((BoolProperty*)prop)->SetValue(backend->IsSelectable());
	else if (str.ICompare("CurrentLine") == 0)
		((IntProperty*)prop)->SetValue(backend->CurrentLine());
	else if (str.ICompare("TabWidth") == 0)
		((FloatProperty*)prop)->SetValue(backend->TabWidth());
	else if (str.ICompare("TextRect") == 0)
		((RectProperty*)prop)->SetValue(backend->TextRect());
	else if (str.ICompare("MaxBytes") == 0)
		((IntProperty*)prop)->SetValue(backend->MaxBytes());
	else if (str.ICompare("UseWordWrap") == 0)
		((BoolProperty*)prop)->SetValue(backend->DoesWordWrap());
	else if (str.ICompare("HideTyping") == 0)
		((BoolProperty*)prop)->SetValue(backend->IsTypingHidden());
	else if (str.ICompare("Editable") == 0)
		((BoolProperty*)prop)->SetValue(backend->IsEditable());
	else if (str.ICompare("ColorSpace") == 0)
		((IntProperty*)prop)->SetValue(backend->ColorSpace());
	else if (str.ICompare("TextLength") == 0)
		((IntProperty*)prop)->SetValue(backend->TextLength());
	else if (str.ICompare("Text") == 0)
		((StringProperty*)prop)->SetValue(backend->Text());
	else if (str.ICompare("Resizable") == 0)
		((BoolProperty*)prop)->SetValue(backend->IsResizable());
	else if (str.ICompare("Alignment") == 0)
		((EnumProperty*)prop)->SetValue(backend->Alignment());
	else if (str.ICompare("Undoable") == 0)
		((BoolProperty*)prop)->SetValue(backend->DoesUndo());
	else if (str.ICompare("AutoIndent") == 0)
		((BoolProperty*)prop)->SetValue(backend->DoesAutoindent());
	else if (str.ICompare("Stylable") == 0)
		((BoolProperty*)prop)->SetValue(backend->IsStylable());
	else
	{
		if (backend->Window())
			backend->Window()->Unlock();

		return PView::GetProperty(name, value, index);
	}

	if (backend->Window())
		backend->Window()->Unlock();

	return prop->GetValue(value);
}
Exemplo n.º 9
0
void
TTextControl::MessageReceived(BMessage *msg)
{
	switch (msg->what) {
		case B_SIMPLE_DATA: {
			if (fIncoming && !fResending)
				return;

			int32 buttons = -1;
			BPoint point;
			if (msg->FindInt32("buttons", &buttons) != B_OK)
				buttons = B_PRIMARY_MOUSE_BUTTON;

			if (buttons != B_PRIMARY_MOUSE_BUTTON
				&& msg->FindPoint("_drop_point_", &point) != B_OK)
				return;

			BMessage message(REFS_RECEIVED);
			bool enclosure = false;
			BString addressList;
				// Batch up the addresses to be added, since we can only
				// insert a few times before deadlocking since inserting
				// sends a notification message to the window BLooper,
				// which is busy doing this insert.  BeOS message queues
				// are annoyingly limited in their design.

			entry_ref ref;
			for (int32 index = 0;msg->FindRef("refs", index, &ref) == B_OK; index++) {
				BFile file(&ref, B_READ_ONLY);
				if (file.InitCheck() == B_NO_ERROR) {
					BNodeInfo info(&file);
					char type[B_FILE_NAME_LENGTH];
					info.GetType(type);

					if (fCommand != SUBJECT_FIELD
						&& !strcmp(type,"application/x-person")) {
						// add person's E-mail address to the To: field

						BString attr = "";
						if (buttons == B_PRIMARY_MOUSE_BUTTON) {
							if (msg->FindString("attr", &attr) < B_OK)
								attr = "META:email"; // If not META:email3 etc.
						} else {
							BNode node(&ref);
							node.RewindAttrs();

							char buffer[B_ATTR_NAME_LENGTH];

							delete fRefDropMenu;
							fRefDropMenu = new BPopUpMenu("RecipientMenu");

							while (node.GetNextAttrName(buffer) == B_OK) {
								if (strstr(buffer, "email") <= 0)
									continue;

								attr = buffer;

								BString address;
								node.ReadAttrString(buffer, &address);
								if (address.Length() <= 0)
									continue;

								BMessage *itemMsg = new BMessage(kMsgAddressChosen);
								itemMsg->AddString("address", address.String());
								itemMsg->AddRef("ref", &ref);

								BMenuItem *item = new BMenuItem(address.String(),
									itemMsg);
								fRefDropMenu->AddItem(item);
							}

							if (fRefDropMenu->CountItems() > 1) {
								fRefDropMenu->SetTargetForItems(this);
								fRefDropMenu->Go(point, true, true, true);
								return;
							} else {
								delete fRefDropMenu;
								fRefDropMenu = NULL;
							}
						}

						BString email;
						file.ReadAttrString(attr.String(), &email);

						// we got something...
						if (email.Length() > 0) {
							// see if we can get a username as well
							BString name;
							file.ReadAttrString("META:name", &name);

							BString	address;
							if (name.Length() == 0) {
								// if we have no Name, just use the email address
								address = email;
							} else {
								// otherwise, pretty-format it
								address << "\"" << name << "\" <" << email << ">";
							}

							if (addressList.Length() > 0)
								addressList << ", ";
							addressList << address;
						}
					} else {
						enclosure = true;
						message.AddRef("refs", &ref);
					}
				}
			}

			if (addressList.Length() > 0) {
				BTextView *textView = TextView();
				int end = textView->TextLength();
				if (end != 0) {
					textView->Select(end, end);
					textView->Insert(", ");
				}
				textView->Insert(addressList.String());
			}

			if (enclosure)
				Window()->PostMessage(&message, Window());
			break;
		}

		case M_SELECT:
		{
			BTextView *textView = (BTextView *)ChildAt(0);
			if (textView != NULL)
				textView->Select(0, textView->TextLength());
			break;
		}

		case kMsgAddressChosen: {
			BString display;
			BString address;
			entry_ref ref;

			if (msg->FindString("address", &address) != B_OK
				|| msg->FindRef("ref", &ref) != B_OK)
				return;

			if (address.Length() > 0) {
				BString name;
				BNode node(&ref);

				display = address;

				node.ReadAttrString("META:name", &name);
				if (name.Length() > 0) {
					display = "";
					display << "\"" << name << "\" <" << address << ">";
				}

				BTextView *textView = TextView();
				int end = textView->TextLength();
				if (end != 0) {
					textView->Select(end, end);
					textView->Insert(", ");
				}
				textView->Insert(display.String());
			}
			break;
		}

		default:
			// BTextControl::MessageReceived(msg);
			BComboBox::MessageReceived(msg);
	}
}
Exemplo n.º 10
0
void
TPrefsWindow::MessageReceived(BMessage* msg)
{
    bool revert = true;
    const char* family;
    const char* signature;
    const char* style;
    char label[256];
    int32 new_size;
    int32 old_size;
    font_family new_family;
    font_family old_family;
    font_style new_style;
    font_style old_style;
    BMenuItem* item;
    BMessage message;

    switch (msg->what) {
    case P_OK:
        if (strcmp(fReplyPreamble->Text(), *fNewPreamble)) {
            free(*fNewPreamble);
            *fNewPreamble
                = (char *)malloc(strlen(fReplyPreamble->Text()) + 1);
            strcpy(*fNewPreamble, fReplyPreamble->Text());
        }
        be_app->PostMessage(PREFS_CHANGED);
        Quit();
        break;

    case P_CANCEL:
        revert = false;
    // supposed to fall through
    case P_REVERT:
        fFont.GetFamilyAndStyle(&old_family, &old_style);
        fNewFont->GetFamilyAndStyle(&new_family, &new_style);
        old_size = (int32)fFont.Size();
        new_size = (int32)fNewFont->Size();
        if (strcmp(old_family, new_family) || strcmp(old_style, new_style)
                || old_size != new_size) {
            fNewFont->SetFamilyAndStyle(old_family, old_style);
            if (revert) {
                sprintf(label, "%s %s", old_family, old_style);
                item = fFontMenu->FindItem(label);
                if (item != NULL)
                    item->SetMarked(true);
            }

            fNewFont->SetSize(old_size);
            if (revert) {
                sprintf(label, "%ld", old_size);
                item = fSizeMenu->FindItem(label);
                if (item != NULL)
                    item->SetMarked(true);
            }
            message.what = M_FONT;
            be_app->PostMessage(&message);
        }
        *fNewWrap = fWrap;
        *fNewAttachAttributes = fAttachAttributes;

        if (strcmp(fSignature, *fNewSignature)) {
            free(*fNewSignature);
            *fNewSignature = (char*)malloc(strlen(fSignature) + 1);
            strcpy(*fNewSignature, fSignature);
        }

        *fNewEncoding = fEncoding;
        *fNewWarnUnencodable = fWarnUnencodable;
        *fNewSpellCheckStartOn = fSpellCheckStartOn;
        *fNewAutoMarkRead = fAutoMarkRead;
        *fNewButtonBar = fButtonBar;

        be_app->PostMessage(PREFS_CHANGED);

        if (revert) {
            for (int i = fAccountMenu->CountItems(); --i > 0;) {
                BMenuItem *item = fAccountMenu->ItemAt(i);
                BMessage* itemMessage = item->Message();
                if (itemMessage != NULL
                        && itemMessage->FindInt32("id") == *(int32 *)&fAccount) {
                    item->SetMarked(true);
                    break;
                }
            }

            strcpy(label,fReplyTo == ACCOUNT_USE_DEFAULT
                   ? B_TRANSLATE("Use default account")
                   : B_TRANSLATE("Account from mail"));
            if ((item = fReplyToMenu->FindItem(label)) != NULL)
                item->SetMarked(true);

            strcpy(label, fWrap ? "On" : "Off");
            if ((item = fWrapMenu->FindItem(label)) != NULL)
                item->SetMarked(true);

            strcpy(label, fAttachAttributes
                   ? B_TRANSLATE("Include file attributes in attachments")
                   : B_TRANSLATE("No file attributes, just plain data"));
            if ((item = fAttachAttributesMenu->FindItem(label)) != NULL)
                item->SetMarked(true);

            strcpy(label, fColoredQuotes ? "On" : "Off");
            if ((item = fColoredQuotesMenu->FindItem(label)) != NULL)
                item->SetMarked(true);

            if (strcmp(fReplyPreamble->Text(), *fNewPreamble))
                fReplyPreamble->SetText(*fNewPreamble);

            item = fSignatureMenu->FindItem(fSignature);
            if (item)
                item->SetMarked(true);

            uint32 index = 0;
            while ((item = fEncodingMenu->ItemAt(index++)) != NULL) {
                BMessage* itemMessage = item->Message();
                if (itemMessage == NULL)
                    continue;

                int32 encoding;
                if (itemMessage->FindInt32("encoding", &encoding) == B_OK
                        && (uint32)encoding == *fNewEncoding) {
                    item->SetMarked(true);
                    break;
                }
            }

            strcpy(label, fWarnUnencodable ? "On" : "Off");
            if ((item = fWarnUnencodableMenu->FindItem(label)) != NULL)
                item->SetMarked(true);

            strcpy(label, fSpellCheckStartOn ? "On" : "Off");
            if ((item = fSpellCheckStartOnMenu->FindItem(label)) != NULL)
                item->SetMarked(true);
        } else
            Quit();
        break;

    case P_FONT:
        family = NULL;
        style = NULL;
        int32 family_menu_index;
        if (msg->FindString("font", &family) == B_OK) {
            msg->FindString("style", &style);
            fNewFont->SetFamilyAndStyle(family, style);
            message.what = M_FONT;
            be_app->PostMessage(&message);
        }

        /* grab this little tidbit so we can set the correct Family */
        if (msg->FindInt32("parent_index", &family_menu_index) == B_OK)
            fFontMenu->ItemAt(family_menu_index)->SetMarked(true);
        break;

    case P_SIZE:
        old_size = (int32) fNewFont->Size();
        msg->FindInt32("size", &new_size);
        if (old_size != new_size) {
            fNewFont->SetSize(new_size);
            message.what = M_FONT;
            be_app->PostMessage(&message);
        }
        break;

    case P_WRAP:
        msg->FindBool("wrap", fNewWrap);
        break;
    case P_ATTACH_ATTRIBUTES:
        msg->FindBool("attachAttributes", fNewAttachAttributes);
        break;
    case P_COLORED_QUOTES:
        msg->FindBool("cquotes", fNewColoredQuotes);
        break;
    case P_ACCOUNT:
        msg->FindInt32("id",(int32*)fNewAccount);
        break;
    case P_REPLYTO:
        msg->FindInt32("replyTo", fNewReplyTo);
        break;
    case P_REPLY_PREAMBLE:
    {
        int32 index = -1;
        if (msg->FindInt32("index", &index) < B_OK)
            break;
        BMenuItem *item = fReplyPreambleMenu->ItemAt(index);
        if (item == NULL) {
            msg->PrintToStream();
            break;
        }

        BTextView *text = fReplyPreamble->TextView();
        // To do: insert at selection point rather than at the end.
        text->Insert(text->TextLength(), item->Label(), 2);
    }
    case P_SIG:
        free(*fNewSignature);
        if (msg->FindString("signature", &signature) == B_NO_ERROR) {
            *fNewSignature = (char*)malloc(strlen(signature) + 1);
            strcpy(*fNewSignature, signature);
        } else {
            *fNewSignature = (char*)malloc(
                                 strlen(B_TRANSLATE("None")) + 1);
            strcpy(*fNewSignature, B_TRANSLATE("None"));
        }
        break;
    case P_ENC:
        msg->FindInt32("encoding", (int32*)fNewEncoding);
        break;
    case P_WARN_UNENCODABLE:
        msg->FindBool("warnUnencodable", fNewWarnUnencodable);
        break;
    case P_SPELL_CHECK_START_ON:
        msg->FindBool("spellCheckStartOn", fNewSpellCheckStartOn);
        break;
    case P_MARK_READ:
        msg->FindBool("autoMarkRead", fNewAutoMarkRead);
        be_app->PostMessage(PREFS_CHANGED);
        break;
    case P_BUTTON_BAR:
        msg->FindInt8("bar", (int8*)fNewButtonBar);
        be_app->PostMessage(PREFS_CHANGED);
        break;

    default:
        BWindow::MessageReceived(msg);
    }

    fFont.GetFamilyAndStyle(&old_family, &old_style);
    fNewFont->GetFamilyAndStyle(&new_family, &new_style);
    old_size = (int32) fFont.Size();
    new_size = (int32) fNewFont->Size();
    bool changed = old_size != new_size
                   || fWrap != *fNewWrap
                   || fAttachAttributes != *fNewAttachAttributes
                   || fColoredQuotes != *fNewColoredQuotes
                   || fAccount != *fNewAccount
                   || fReplyTo != *fNewReplyTo
                   || strcmp(old_family, new_family)
                   || strcmp(old_style, new_style)
                   || strcmp(fReplyPreamble->Text(), *fNewPreamble)
                   || strcmp(fSignature, *fNewSignature)
                   || fEncoding != *fNewEncoding
                   || fWarnUnencodable != *fNewWarnUnencodable
                   || fSpellCheckStartOn != *fNewSpellCheckStartOn
                   || fAutoMarkRead != *fNewAutoMarkRead
                   || fButtonBar != *fNewButtonBar;
    fRevert->SetEnabled(changed);
}