⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 displaymanager.java

📁 开源的java 编辑器源代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
			}			callChanged = true;			// JEditTextArea.scrollTo() needs this to simplify			// its code			if(screenAmount < 0)				scrollUp(-screenAmount);			else if(screenAmount > 0)				scrollDown(screenAmount);		} //}}}		//{{{ physUp() method		// scroll up by physical line amount		void physUp(int amount, int screenAmount)		{			if(Debug.SCROLL_DEBUG)			{				Log.log(Log.DEBUG,this,"physUp() start: "					+ physicalLine + ":" + scrollLine);			}			skew = 0;			if(!isLineVisible(physicalLine))			{				int firstVisibleLine = getFirstVisibleLine();				if(physicalLine < firstVisibleLine)					physicalLine = firstVisibleLine;				else				{					int prevPhysicalLine = getPrevVisibleLine(physicalLine);					amount -= (physicalLine - prevPhysicalLine);				}			}			for(;;)			{				int prevPhysicalLine = getPrevVisibleLine(					physicalLine);				if(prevPhysicalLine == -1)					break;				else if(prevPhysicalLine < physicalLine - amount)					break;				else				{					amount -= (physicalLine - prevPhysicalLine);					physicalLine = prevPhysicalLine;					scrollLine -= getScreenLineCount(						prevPhysicalLine);				}			}			if(Debug.SCROLL_DEBUG)			{				Log.log(Log.DEBUG,this,"physUp() end: "					+ physicalLine + ":" + scrollLine);			}			callChanged = true;			// JEditTextArea.scrollTo() needs this to simplify			// its code			if(screenAmount < 0)				scrollUp(-screenAmount);			else if(screenAmount > 0)				scrollDown(screenAmount);		} //}}}		//{{{ scrollDown() method		// scroll down by screen line amount		void scrollDown(int amount)		{			if(Debug.SCROLL_DEBUG)				Log.log(Log.DEBUG,this,"scrollDown()");			ensurePhysicalLineIsVisible();			amount += skew;			skew = 0;			while(amount > 0)			{				int screenLines = getScreenLineCount(physicalLine);				if(amount < screenLines)				{					skew = amount;					break;				}				else				{					int nextLine = getNextVisibleLine(physicalLine);					if(nextLine == -1)						break;					boolean visible = isLineVisible(physicalLine);					physicalLine = nextLine;					if(visible)					{						amount -= screenLines;						scrollLine += screenLines;					}				}			}			callChanged = true;		} //}}}		//{{{ scrollUp() method		// scroll up by screen line amount		void scrollUp(int amount)		{			if(Debug.SCROLL_DEBUG)				Log.log(Log.DEBUG,this,"scrollUp()");			ensurePhysicalLineIsVisible();			if(amount <= skew)			{				skew -= amount;			}			else			{				amount -= skew;				skew = 0;				while(amount > 0)				{					int prevLine = getPrevVisibleLine(physicalLine);					if(prevLine == -1)						break;					physicalLine = prevLine;					int screenLines = getScreenLineCount(physicalLine);					scrollLine -= screenLines;					if(amount < screenLines)					{						skew = screenLines - amount;						break;					}					else						amount -= screenLines;				}			}			callChanged = true;		} //}}}		//{{{ ensurePhysicalLineIsVisible() method		private void ensurePhysicalLineIsVisible()		{			if(!isLineVisible(physicalLine))			{				if(physicalLine > getLastVisibleLine())				{					physicalLine = getLastVisibleLine();					scrollLine = getScrollLineCount() - 1;				}				else if(physicalLine < getFirstVisibleLine())				{					physicalLine = getFirstVisibleLine();					scrollLine = 0;				}				else				{					physicalLine = getNextVisibleLine(physicalLine);					scrollLine += getScreenLineCount(physicalLine);				}			}		} //}}}	} //}}}	//{{{ BufferChangeHandler class	/**	 * Note that in this class we take great care to defer complicated	 * calculations to the end of the current transaction if the buffer	 * informs us a compound edit is in progress	 * (<code>isTransactionInProgress()</code>).	 *	 * This greatly speeds up replace all for example, by only doing certain	 * things once, particularly in <code>moveCaretPosition()</code>.	 *	 * Try doing a replace all in a large file, for example. It is very slow	 * in 3.2, faster in 4.0 (where the transaction optimization was	 * introduced) and faster still in 4.1 (where it was further improved).	 *	 * There is still work to do; see TODO.txt.	 */	class BufferChangeHandler extends BufferChangeAdapter	{		boolean delayedUpdate;		boolean delayedMultilineUpdate;		int delayedUpdateStart;		int delayedUpdateEnd;		//{{{ foldHandlerChanged() method		public void foldHandlerChanged(Buffer buffer)		{			fvmreset();			firstLine.callReset = true;			scrollLineCount.callReset = true;			int collapseFolds = buffer.getIntegerProperty(				"collapseFolds",0);			if(collapseFolds != 0)				expandFolds(collapseFolds);			_notifyScreenLineChanges();		} //}}}		//{{{ foldLevelChanged() method		public void foldLevelChanged(Buffer buffer, int start, int end)		{			if(textArea.getDisplayManager() == DisplayManager.this				&& end != 0 && buffer.isLoaded())			{				textArea.invalidateLineRange(start - 1,					textArea.getLastPhysicalLine());			}		} //}}}		//{{{ contentInserted() method		public void contentInserted(Buffer buffer, int startLine,			int offset, int numLines, int length)		{			if(!buffer.isLoaded())				return;			int endLine = startLine + numLines;			if(numLines != 0)			{				delayedMultilineUpdate = true;				/* this is a sloppy hack to fix bug				   "[ 677902 ] hitting return after collapsed				   fold"				   the idea is that if we extend the range then				   the problem described in the bug happends, so				   if the insert is at the very end of the range				   we don't extend it, instead we push the				   insert into the next range, however for this				   to work properly we also have to mess with				   screen line counts. */				int index = fvmget(startLine);				int start = index + 1;				/* if(start + 1 < fvmcount && fvm[start]					== startLine + 1)				{					if(index % 2 == 0)					{						System.err.println("case 1");						scrollLineCount.scrollLine -=							getScreenLineCount(							startLine + 1);						start++;					}				} */				for(int i = start; i < fvmcount; i++)				{					fvm[i] += numLines;				}				lastfvmget = -1;				fvmdump();			}			if(textArea.getDisplayManager() == DisplayManager.this)			{				if(numLines != 0)				{					contentInserted(firstLine,startLine,numLines);					contentInserted(scrollLineCount,startLine,numLines);				}				if(delayedUpdateEnd >= startLine)					delayedUpdateEnd += numLines;				delayedUpdate(startLine,endLine);				//{{{ resize selections if necessary				for(int i = 0; i < textArea.selection.size(); i++)				{					Selection s = (Selection)textArea						.selection.elementAt(i);						if(s.contentInserted(buffer,startLine,offset,						numLines,length))					{						delayedUpdate(s.startLine,s.endLine);					}				} //}}}				int caret = textArea.getCaretPosition();				if(caret >= offset)				{					int scrollMode = (caretAutoScroll()						? JEditTextArea.ELECTRIC_SCROLL						: JEditTextArea.NO_SCROLL);					textArea.moveCaretPosition(						caret + length,scrollMode);				}				else				{					int scrollMode = (caretAutoScroll()						? JEditTextArea.NORMAL_SCROLL						: JEditTextArea.NO_SCROLL);					textArea.moveCaretPosition(						caret,scrollMode);				}			}			else			{				firstLine.callReset = true;				scrollLineCount.callReset = true;			}		} //}}}		//{{{ preContentRemoved() method		public void preContentRemoved(Buffer buffer, int startLine,			int offset, int numLines, int length)		{			if(!buffer.isLoaded())				return;			if(textArea.getDisplayManager() == DisplayManager.this)			{				if(numLines != 0)				{					preContentRemoved(firstLine,startLine,numLines);					preContentRemoved(scrollLineCount,startLine,numLines);				}				if(delayedUpdateEnd >= startLine)					delayedUpdateEnd -= numLines;				delayedUpdate(startLine,startLine);			}			else			{				firstLine.callReset = true;				scrollLineCount.callReset = true;			}			if(numLines != 0)			{				delayedMultilineUpdate = true;				int endLine = startLine + numLines;				/* update fold visibility map. */				int starti = fvmget(startLine);				int endi = fvmget(endLine);				/* both have same visibility; just remove				 * anything in between. */				if(Math.abs(starti % 2) == Math.abs(endi % 2))				{					if(endi - starti == fvmcount)					{						// we're removing from before						// the first visible to after						// the last visible						fvmreset();						firstLine.callReset = true;						scrollLineCount.callReset = true;					}					else					{						fvmput(starti + 1,endi + 1,null);						starti++;					}				}				/* collapse 2 */				else if(starti != -1 && fvm[starti] == startLine)				{					//int newStart = fvm[endi + 1] - 1;					fvmput(starti,endi + 1,null);					//fvm[starti] = newStart;					//starti++;				}				/* shift */				else				{					fvmput(starti + 1,endi,null);					fvm[starti + 1] = startLine;					starti += 2;				}				/* update */				for(int i = starti; i < fvmcount; i++)					fvm[i] -= numLines;				if(firstLine.physicalLine					> getLastVisibleLine()					|| firstLine.physicalLine					< getFirstVisibleLine())				{					// will be handled later.					// see comments at the end of					// transactionComplete().				}				// very subtle... if we leave this for				// ensurePhysicalLineIsVisible(), an				// extra line will be added to the				// scroll line count.				else if(!isLineVisible(					firstLine.physicalLine))				{					firstLine.physicalLine =						getNextVisibleLine(						firstLine.physicalLine);				}				lastfvmget = -1;				fvmdump();			}		} //}}}		//{{{ contentRemoved() method		public void contentRemoved(Buffer buffer, int startLine,			int start, int numLines, int length)		{			if(!buffer.isLoaded())				return;			if(textArea.getDisplayManager() == DisplayManager.this)			{				int endLine = startLine + numLines;				//{{{ resize selections if necessary				for(int i = 0; i < textArea.selection.size(); i++)				{					Selection s = (Selection)textArea						.selection.elementAt(i);						if(s.contentRemoved(buffer,startLine,						start,numLines,length))					{						delayedUpdate(s.startLine,s.endLine);						if(s.start == s.end)						{							textArea.selection.removeElementAt(i);							i--;						}					}				} //}}}				int caret = textArea.getCaretPosition();				if(caret >= start + length)				{					int scrollMode = (caretAutoScroll()						? JEditTextArea.ELECTRIC_SCROLL						: JEditTextArea.NO_SCROLL);					textArea.moveCaretPosition(						caret - length,						scrollMode);				}				else if(caret >= start)				{					int scrollMode = (caretAutoScroll()						? JEditTextArea.ELECTRIC_SCROLL						: JEditTextArea.NO_SCROLL);					textArea.moveCaretPosition(						start,scrollMode);				}				else				{					int scrollMode = (caretAutoScroll()						? JEditTextArea.NORMAL_SCROLL						: JEditTextArea.NO_SCROLL);					textArea.moveCaretPosition(caret,scrollMode);				}			}		}		//}}}		//{{{ transactionComplete() method		public void transactionComplete(Buffer buffer)		{			if(textArea.getDisplayManager() == DisplayManager.this)			{				if(delayedUpdate)				{					// must be before the below call					// so that the chunk cache is not					// updated with an invisible first					// line (see above)					_notifyScreenLineChanges();					if(delayedMultilineUpdate)					{						textArea.invalidateScreenLineRange(							textArea.chunkCache							.getScreenLineOfOffset(							delayedUpdateStart,0),							textArea.getVisibleLines());						delayedMultilineUpdate = false;					}					else					{						textArea.invalidateLineRange(							delayedUpdateStart,							delayedUpdateEnd);					}					int _firstLine = textArea.getFirstPhysicalLine();					int _lastLine = textArea.getLastPhysicalLine();					int line = delayedUpdateStart;					if(!isLineVisible(line))						line = getNextVisibleLine(line);					while(line != -1 && line <= delayedUpdateEnd)					{						if(line < _firstLine							|| line > _lastLine)						{							getScreenLineCount(line);						}						line = getNextVisibleLine(line);					}					// update visible lines					int visibleLines = textArea						.getVisibleLines();					if(visibleLines != 0)					{						textArea.chunkCache.getLineInfo(							visibleLines - 1);					}				}				textArea._finishCaretUpdate();			}			//{{{ Debug code			if(Debug.SCROLL_VERIFY)			{				int scrollLineCount = 0;				for(int i = 0; i < textArea.getLineCount(); i++)				{					if(isLineVisible(i))					{						scrollLineCount +=							getScreenLineCount(i);					}				}				if(scrollLineCount != getScrollLineCount())				{					throw new InternalError(scrollLineCount						+ " != "						+ getScrollLineCount());				}			} //}}}			delayedUpdate = false;		} //}}}		//{{{ contentInserted() method		private void contentInserted(Anchor anchor, int startLine,			int numLines)		{			if(anchor.physicalLine >= startLine)			{				if(anchor.physicalLine != startLine)					anchor.physicalLine += numLines;				anchor.callChanged = true;			}		} //}}}		//{{{ preContentRemoved() method		private void preContentRemoved(Anchor anchor, int startLine,			int numLines)		{			if(anchor.physicalLine >= startLine)			{				if(anchor.physicalLine == startLine)					anchor.callChanged = true;				else				{					int end = Math.min(startLine + numLines,						anchor.physicalLine);					for(int i = startLine; i < end; i++)					{						//XXX						if(isLineVisible(i))						{							anchor.scrollLine -=								lineMgr								.getScreenLineCount(i);						}					}					anchor.physicalLine -= (end - startLine);					anchor.callChanged = true;				}			}		} //}}}		//{{{ delayedUpdate() method		private void delayedUpdate(int startLine, int endLine)		{			textArea.chunkCache.invalidateChunksFromPhys(startLine);			if(!delayedUpdate)			{				delayedUpdateStart = startLine;				delayedUpdateEnd = endLine;				delayedUpdate = true;			}			else			{				delayedUpdateStart = Math.min(					delayedUpdateStart,					startLine);				delayedUpdateEnd = Math.max(					delayedUpdateEnd,					endLine);			}		} //}}}		//{{{ caretAutoScroll() method		/**		 * Return if change in buffer should scroll this text area.		 */		private boolean caretAutoScroll()		{			View view = textArea.getView();			return view == jEdit.getActiveView()				&& view.getTextArea() == textArea;		} //}}}	} //}}}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -