Пример #1
0
bool ChannelNick::setOp(bool state)
{
    if(m_isop==state) return false;
    m_isop=state;
    markAsChanged();
    return true;
}
Пример #2
0
bool ChannelNick::setAdmin(bool state)
{
    if(m_isadmin==state) return false;
    m_isadmin=state;
    markAsChanged();
    return true;
}
Пример #3
0
/** set the voice for the nick, and update
 * @returns Whether it needed to be changed.  False for no change.
 */
bool ChannelNick::setVoice(bool state)
{
    if(m_hasvoice==state) return false;
    m_hasvoice=state;
    markAsChanged();
    return true;
}
Пример #4
0
bool ChannelNick::setMode(bool admin,bool owner,bool op,bool halfop,bool voice)
{
    if(m_isadmin==admin && m_isowner==owner && m_isop==op && m_ishalfop==halfop && m_hasvoice==voice)
        return false;
    m_isadmin=admin;
    m_isowner=owner;
    m_isop=op;
    m_ishalfop=halfop;
    m_hasvoice=voice;
    markAsChanged();
    return true;
}
Пример #5
0
FlexTextReader::Result FlexTextImporter::readFile(const QString & filepath)
{
    QFile file(filepath);
    file.open(QFile::ReadOnly);
    QXmlStreamReader stream(&file);

    mText->removeAllParagraphs();

    bool inWord = false;
    bool inPhrase = false;
    TextBitHash textForms;
    TextBitHash glossForms;

    while (!stream.atEnd())
    {
        stream.readNext();
        QString name = stream.name().toString();
        if( stream.tokenType() == QXmlStreamReader::StartElement )
        {
            if( name == "word" )
            {
                inWord = true;
                textForms.clear();
                glossForms.clear();
            }
            else if ( name == "paragraph" ) // <paragraph>
            {
                mText->mParagraphs.append( new Paragraph(mText->mBaselineWritingSystem) );
                QObject::connect( mText->mParagraphs.last(), SIGNAL(changed()), mText, SLOT(markAsChanged()) );
            }
            else if ( name == "phrase" )
            {
                inPhrase = true;
                mText->mParagraphs.last()->mPhrases.append( new Phrase(mText, mText->mProject) );
                mText->mParagraphs.last()->mPhrases.last()->connectToText();

                QXmlStreamAttributes attr = stream.attributes();
                if( attr.hasAttribute("http://www.adambaker.org/gloss.php","annotation-start") && attr.hasAttribute("http://www.adambaker.org/gloss.php","annotation-end") )
                {
                    qlonglong start = attr.value("http://www.adambaker.org/gloss.php","annotation-start").toString().toLongLong();
                    qlonglong end = attr.value("http://www.adambaker.org/gloss.php","annotation-end").toString().toLongLong();
                    mText->mParagraphs.last()->phrases()->last()->setInterval( Interval(start, end) );
                }
            }
            else if ( name == "item" )
            {
                QXmlStreamAttributes attr = stream.attributes();
                if( attr.hasAttribute("type") )
                {
                    QString type = attr.value("type").toString();
                    WritingSystem lang;
                    if( attr.hasAttribute("lang") )
                            lang = mText->mProject->dbAdapter()->writingSystem( attr.value("lang").toString() );
                    QString text = stream.readElementText();

                    if( inWord )
                    {
                        qlonglong itemId = attr.hasAttribute("http://www.adambaker.org/gloss.php","id") ? attr.value("http://www.adambaker.org/gloss.php","id").toString().toLongLong() : -1;
                        // there's no handling here for the case where itemId == -1
                        // that is handled in GlossItem::loadStringsFromDatabase()
                        if( type == "txt" )
                        {
                            TextBit textForm( text , lang, itemId);
                            textForms.insert( lang, textForm );
                        }
                        else if( type == "gls" )
                        {
                            glossForms.insert( lang, TextBit( text , lang, itemId) );
                        }
                        else if ( type == "punct" )
                        {
                            TextBit textForm( text , lang, itemId);
                            textForms.insert( lang, textForm );
                        }
                    }
                    else if ( inPhrase && type == "gls" )
                    {
                        mText->mParagraphs.last()->phrases()->last()->setPhrasalGloss( TextBit( text , lang ) );
                    }
                }
            }
            else if(name == "interlinear-text")
            {
                QXmlStreamAttributes attr = stream.attributes();
                if( attr.hasAttribute("http://www.adambaker.org/gloss.php","audio-file") )
                {
                    mText->setSound( QUrl::fromEncoded( attr.value("http://www.adambaker.org/gloss.php","audio-file").toString().toUtf8() ) );
                }
            }
            else if(name == "morphemes")
            {
                /// Skip over any <morphemes> element
                while( !( stream.name().toString() == "morphemes" && stream.tokenType() == QXmlStreamReader::EndElement ) )
                {
                    stream.readNext();
                }
            }
        }
        else if( stream.tokenType() == QXmlStreamReader::EndElement )
        {
            if(name == "word")
            {
                mText->mParagraphs.last()->phrases()->last()->appendGlossItem(new GlossItem( mText->mBaselineWritingSystem, textForms, glossForms, mText->mProject ));
                inWord = false;
            }
            else if(name == "phrase")
            {
                inPhrase = false;
            }
        }
    }

    file.close();

    if (stream.hasError()) {
        qWarning() << "FlexTextImporter::readTextFromFlexText error with xml reading";
        return FlexTextImporter::FlexTextReadXmlReadError;
    }

    return FlexTextImporter::FlexTextReadSuccess;
}
Пример #6
0
    /**
     * Submits the image to the backing store, or commits it if no backing
     * store is available.
     *
     * @param image  Image.
     * @param rect   Rectangle for the image determined by an IAllocator.
     */
    void submitImage(Image const &image, Rectanglei const &rect)
    {
        Rectanglei const noBorders  = rect.shrunk(border);
        Rectanglei const withMargin = rect.expanded(margin);

        if (hasBacking())
        {
            // The margin is cleared to transparent black.
            backing.fill(withMargin, Image::Color(0, 0, 0, 0));

            if (border > 0)
            {
                if (flags.testFlag(WrapBordersInBackingStore))
                {
                    // Wrap using the source image (left, right, top, bottom edges).
                    backing.drawPartial(image, Rectanglei(0, 0, border, image.height()),
                                           rect.topRight() + Vector2i(-border, border));

                    backing.drawPartial(image, Rectanglei(image.width() - border, 0,
                                                             border, image.height()),
                                           rect.topLeft + Vector2i(0, border));

                    backing.drawPartial(image, Rectanglei(0, 0, image.width(), border),
                                           rect.bottomLeft() + Vector2i(border, -border));

                    backing.drawPartial(image, Rectanglei(0, image.height() - border,
                                                             image.width(), border),
                                           rect.topLeft + Vector2i(border, 0));
                }
            }
            backing.draw(image, noBorders.topLeft);

            //backing.toQImage().save(QString("backing-%1.png").arg(uint64_t(this)));

            markAsChanged(rect);
        }
        else
        {
            // No backing, must commit immediately.
            if (border > 0)
            {
                // Expand with borders (repeat edges).
                QImage const srcImg = image.toQImage();
                int const sw = srcImg.width();
                int const sh = srcImg.height();

                QImage bordered(QSize(rect.width(), rect.height()), srcImg.format());
                int const w = bordered.width();
                int const h = bordered.height();

                QPainter painter(&bordered);
                painter.setCompositionMode(QPainter::CompositionMode_Source);
                painter.fillRect(bordered.rect(), QColor(0, 0, 0, 0));

                /// @todo This really only works for a border of 1 pixels. Should
                /// repeat the same outmost edge pixels for every border. -jk

                painter.drawImage(border, border, srcImg);
                painter.drawImage(border, 0,     srcImg, 0, 0, sw, 1); // top
                painter.drawImage(border, h - 1, srcImg, 0, sh - 1, sw, 1); // bottom
                painter.drawImage(0, border,     srcImg, 0, 0, 1, sh); // left
                painter.drawImage(w - 1, border, srcImg, sw - 1, 0, 1, sh); // right

                // Corners.
                painter.drawImage(0, 0,         srcImg, 0, 0, 1, 1);
                painter.drawImage(w - 1, 0,     srcImg, sw - 1, 0, 1, 1);
                painter.drawImage(0, h - 1,     srcImg, 0, sh - 1, 1, 1);
                painter.drawImage(w - 1, h - 1, srcImg, sw - 1, sh - 1, 1, 1);

                self().commit(bordered, rect.topLeft);
            }
            else
            {
                self().commit(image, noBorders.topLeft);
            }
        }
    }
Пример #7
0
bool compareNew()
{
	clearWindow(nppData._scintillaMainHandle, true);
	clearWindow(nppData._scintillaSecondHandle, true);
	
    active = true;

	int doc1Length;
	int *lineNum1;

	char **doc1 = getAllLines(nppData._scintillaMainHandle, &doc1Length, &lineNum1);

	if(doc1Length < 1)
    {
        return true;
    }

	int doc2Length;
	int *lineNum2;

	char **doc2 = getAllLines(nppData._scintillaSecondHandle, &doc2Length, &lineNum2);
	
    if(doc2Length < 1)
    {
        return true;
    }

	int	doc1Changed = 0;
	int	doc2Changed = 0;
	diff_edit *doc1Changes = NULL;
	diff_edit *doc2Changes = NULL;

	unsigned int *doc1Hashes = computeHashes(doc1, doc1Length, Settings.IncludeSpace);
	unsigned int *doc2Hashes = computeHashes(doc2, doc2Length, Settings.IncludeSpace);

	/* make diff */
	int sn;
	struct varray *ses = varray_new(sizeof(struct diff_edit), NULL);
	int result = (diff(doc1Hashes, 0, doc1Length, doc2Hashes, 0, doc2Length, (idx_fn)(getLineFromIndex), (cmp_fn)(compareLines), NULL, 0, ses, &sn, NULL));
	int changeOffset = 0;

    shift_boundries(ses, sn, doc1Hashes, doc2Hashes, doc1Length, doc2Length);
	find_moves(ses, sn, doc1Hashes, doc2Hashes, Settings.DetectMove);
	/* 
     * - insert empty lines
	 * - count changed lines
	 */
	doc1Changed = 0;
	doc2Changed = 0;

	for (int i = 0; i < sn; i++) 
    {
		struct diff_edit *e =(diff_edit*) varray_get(ses, i);
		if(e->op == DIFF_DELETE)
        {
			e->changeCount = 0;
			doc1Changed += e->len;
			struct diff_edit *e2 =(diff_edit*) varray_get(ses, i+1);
			e2->changeCount = 0;
			
            if(e2->op == DIFF_INSERT)
            {
				//see if the DELETE/INSERT COMBO includes changed lines or if its a completely new block
				if(compareWords(e, e2, doc1, doc2, Settings.IncludeSpace))
				{
					e->op = DIFF_CHANGE1;
					e2->op = DIFF_CHANGE2;
					doc2Changed += e2->len;
				}
			}
		}
        else if(e->op == DIFF_INSERT)
        {
			e->changeCount = 0;
			doc2Changed += e->len;
		}
	}

	int doc1CurrentChange = 0;
	int doc2CurrentChange = 0;
	changeOffset = 0;
	doc1Changes = new diff_edit[doc1Changed];
	doc2Changes = new diff_edit[doc2Changed];
	int doc1Offset = 0;
	int doc2Offset = 0;

	//switch from blocks of lines to one change per line. Change CHANGE to DELETE or INSERT if there are no changes on that line
	int added;

	for (int i = 0; i < sn; i++) 
    {
		struct diff_edit *e =(diff_edit*) varray_get(ses, i);
		e->set = i;

		switch(e->op)
        {
			case DIFF_CHANGE1:
			case DIFF_DELETE:
				added = setDiffLines(e, doc1Changes, &doc1CurrentChange, DIFF_DELETE, e->off + doc2Offset);
				doc2Offset -= added;
				doc1Offset += added;
				break;
			case DIFF_INSERT:
			case DIFF_CHANGE2:
				added = setDiffLines(e, doc2Changes, &doc2CurrentChange, DIFF_INSERT, e->off + doc1Offset);	
				doc1Offset -= added;
				doc2Offset += added;
				break;
		}
	}

	if (result != -1)
    {
		int textIndex;
		different = (doc1Changed > 0) || (doc2Changed > 0);
		
        for(int i = 0; i < doc1Changed; i++)
        {
			switch(doc1Changes[i].op)
            {
				case DIFF_DELETE:
					markAsRemoved(nppData._scintillaMainHandle, doc1Changes[i].off);					
					break;

				case DIFF_CHANGE1:
					markAsChanged(nppData._scintillaMainHandle, doc1Changes[i].off);
					textIndex = lineNum1[doc1Changes[i].off];

					for(int k = 0; k < doc1Changes[i].changeCount; k++)
                    {
						struct diff_change *change = (diff_change*)varray_get(doc1Changes[i].changes, k);
						markTextAsChanged(nppData._scintillaMainHandle, textIndex + change->off, change->len);
					}
					break;

				case DIFF_MOVE:					
					markAsMoved(nppData._scintillaMainHandle, doc1Changes[i].off);
					break;

			}
		}

		for(int i = 0; i < doc2Changed; i++)
        {
			switch(doc2Changes[i].op)
            {
				case DIFF_INSERT:					
					markAsAdded(nppData._scintillaSecondHandle, doc2Changes[i].off);						
					break;

				case DIFF_CHANGE2:
					markAsChanged(nppData._scintillaSecondHandle, doc2Changes[i].off);
					textIndex = lineNum2[doc2Changes[i].off];
					for(int k = 0; k < doc2Changes[i].changeCount; k++)
                    {
						struct diff_change *change=(diff_change*)varray_get(doc2Changes[i].changes, k);
						markTextAsChanged(nppData._scintillaSecondHandle, textIndex+change->off, change->len);
					}
					break;

				case DIFF_MOVE:					
					markAsMoved(nppData._scintillaSecondHandle,doc2Changes[i].off);										
					break;
			}
		}

		doc1Offset = 0;
		doc2Offset = 0;

		if(Settings.AddLine)
        {
			int length = 0;
			int off = -1;
			for(int i = 0; i < doc1Changed; i++)
            {
				switch(doc1Changes[i].op)
                {
					case DIFF_DELETE:
					case DIFF_MOVE:							
						if(doc1Changes[i].altLocation == off)
                        {
							length++;
						}
                        else
                        {
							addEmptyLines(nppData._scintillaSecondHandle, off + doc2Offset, length);
							doc2Offset += length;
							off = doc1Changes[i].altLocation;
							length = 1;						
						}
						break;
				}
			}

			addEmptyLines(nppData._scintillaSecondHandle, off + doc2Offset, length);

			if(doc2Offset > 0)
            {
				clearUndoBuffer(nppData._scintillaSecondHandle);
			}

			length = 0;
			off = 0;
			doc1Offset = 0;

			for(int i = 0; i < doc2Changed; i++)
            {
				switch(doc2Changes[i].op)
                {
					case DIFF_INSERT:
					case DIFF_MOVE:							
						if(doc2Changes[i].altLocation == off)
                        {
							length++;
						}
                        else
                        {
							addEmptyLines(nppData._scintillaMainHandle, off + doc1Offset, length);
							doc1Offset += length;
							off = doc2Changes[i].altLocation;
							length = 1;						
						}
						break;
				}
			}

			addEmptyLines(nppData._scintillaMainHandle, off + doc1Offset, length);

			if(doc1Offset > 0)
            {
				clearUndoBuffer(nppData._scintillaMainHandle);
			}
		}

//clean up resources
#if CLEANUP

		for(int i = 0; i < doc1Length; i++)
        {
			if(*doc1[i] != 0)
            {
				delete[] doc1[i];
			}
		}

		delete[] doc1;
		delete[] lineNum1;
		
        for(int i = 0; i < doc2Length; i++)
        {
			if(*doc2[i] != 0)
            {
				delete[] doc2[i];
			}
		}

		delete[] doc2;
		delete lineNum2;

		delete[] doc1Hashes;
		delete[] doc2Hashes;

		clearEdits(ses, sn);

		for(int i = 0; i < doc1Changed; i++)
        {
			clearEdit(doc1Changes + (i));
		}

		delete[] doc1Changes;

		for(int i = 0; i < doc2Changed; i++)
        {
			clearEdit(doc2Changes+(i));
		}

		delete[] doc2Changes;

#endif // CLEANUP

		if(!different)
        {
			::MessageBox(nppData._nppHandle, TEXT("Files Match"), TEXT("Results :"), MB_OK);
			return true;
		}

		::SendMessageA(nppData._scintillaMainHandle, SCI_SHOWLINES, 0, (LPARAM)1);
		::SendMessageA(nppData._scintillaSecondHandle, SCI_SHOWLINES, 0, (LPARAM)1);

		return false;
	}
    return false;
}