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

📄 smswindow.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
		gd.widthHint = 100;
		textSender = UITool.createSingleText(bottom, gd);
		textSender.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if (Character.isISOControl(e.character))
					return;
				String text = textSender.getText();
				byte[] b = Util.getBytes(text);
				int addLen = Util.getBytes(Character.toString(e.character)).length;
				if (b.length + addLen > QQ.QQ_MAX_SMS_SENDER_NAME)
					e.doit = false;
			}
		});
		textSender.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				maxFragmentLength = QQ.QQ_MAX_SMS_LENGTH - textSender.getText().length();
				calculateFragmentCount();
				refreshHint();
			}
		});
		btnSend = new Slat(bottom);
		btnSend.setText(button_send_accel);
		btnSend.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
		btnSend.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseUp(MouseEvent e) {
				Slat temp = (Slat) e.getSource();
				if (e.x > temp.getSize().x || e.y > temp.getSize().y || e.x < 0 || e.y < 0) {
					return;
				}
				sendAction.run();
			}
		});

		// 聊天记录控件
		if (singleMode) {
			if (isUser)
				viewer = new RecordViewer(container, new SMSRecordProvider(friend), main);
			else
				viewer = new RecordViewer(container, new SMSRecordProvider(mobile), main);
			viewer.setFont(res.getDefaultFont());
			viewer.setRecordManager(main.getRecordManager());
			viewer.setBackground(Colors.LOGIN_BACKGROUND);
			gd = new GridData(GridData.FILL_HORIZONTAL);
			gd.horizontalSpan = 2;
			gd.heightHint = 200;
			gd.exclude = true;
			viewer.setLayoutData(gd);

			if (!isUser)
				viewer.setFilter(new SMSFilter(mobile));
		}
		btnRecord.setVisible(singleMode);

		initializeControl();
		initializeKeyAction();
		return control;
	}

	/**
	 * 显示记录控件
	 */
	private void showRecord() {
		GridData gd = (GridData) viewer.getLayoutData();
		Shell shell = getShell();
		if (gd.exclude) {
			gd.exclude = false;
			viewer.refreshRecord();
		} else {
			gd.exclude = true;
		}
		if (!shell.getMaximized()) {
			Point p = shell.getSize();
			shell.setSize(p.x, p.y + (gd.exclude ? -205 : 205));
		}
		viewer.setVisible(!gd.exclude);
		viewer.getParent().layout();
		shell.layout();
	}

	protected void refreshHint() {
		lblHint.setText(NLS.bind(sms_will_send, String.valueOf(fragmentCount)));
	}

	private void initializeKeyAction() {
		// mod3 -> alt
		inputBox.setUserKeyAction('S' | SWT.MOD3, sendAction);
		if (singleMode)
			inputBox.setUserKeyAction('H' | SWT.MOD3, recordAction);
	}

	private void initializeControl() {
		textSender.setText(main.getMyModel().displayName);
		if (receiver != null)
			textReceiver.setText(receiver);
	}

	public void append(String text, LineStyle style) {
		outputBox.appendText(text, style);
		outputBox.appendText(CRLF, style);
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.lumaqq.qq.events.IQQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
	 */
	public void qqEvent(QQEvent e) {
		switch (e.type) {
			case QQEvent.QQ_SMS_SENT:
				processSMSSent(e);
				break;
			case QQEvent.QQ_OPERATION_TIMEOUT:
				switch (e.operation) {
					case QQ.QQ_CMD_SEND_SMS:
						processSMSTimeout(e);
						break;
				}
				break;
		}
	}

	/**
	 * 处理发送超时事件
	 * 
	 * @param e
	 */
	private void processSMSTimeout(QQEvent e) {
		SendSMSPacket packet = (SendSMSPacket) e.getSource();
		if (expected != packet.getSequence())
			return;
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				append(sms_timeout, otherStyle);
				reset();
			}
		});
	}

	/**
	 * 推入一个短信包
	 * 
	 * @param packet
	 */
	public void putSMS(ReceiveIMPacket packet) {
		outputBox.appendText('(' + DefaultFace.escapeFaces(packet.sms.senderName) + ")  " + DateTool.format(packet.sms.time), otherStyle);
		outputBox.appendText(packet.sms.message, otherStyle);
		if (receiver == null || receiver.trim().equals("")) {
			if (packet.sms.sender == 10000)
				setReceiver(packet.sms.senderName);
			else
				setReceiver(String.valueOf(packet.sms.sender));
		}
	}

	/**
	 * 处理发送完毕事件
	 * 
	 * @param e
	 */
	private void processSMSSent(QQEvent e) {
		final SendSMSReplyPacket packet = (SendSMSReplyPacket) e.getSource();
		if (expected != packet.getSequence())
			return;
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				// 显示回复信息,如果发送成功,则保存到聊天记录
				for (SMSReply reply : packet.replies) {
					switch (reply.replyCode) {
						case QQ.QQ_REPLY_SMS_FAIL:
							append(NLS.bind(sms_fail, reply.message, reply.isQQ ? String.valueOf(reply.qq) : reply.mobile), otherStyle);
							stop = true;
							break;
						case QQ.QQ_REPLY_SMS_OK:
							if (nextFragment == fragmentCount - 1)
								saveMessage(reply);
							append(NLS.bind(sms_success, reply.message, reply.isQQ ? String.valueOf(reply.qq) : reply.mobile), otherStyle);
							break;
					}
				}
				append(packet.message, otherStyle);

				// 继续发送
				if (stop)
					reset();
				else {
					if (nextFragment < fragmentCount - 1) {
						/*
						 * 还有分片没发完
						 */
						nextFragment++;
						send(getNextFragment());
					} else {
						/*
						 * 检查是否还有其他接收者
						 */
						rebuildReceiverList(packet.replies);
						if (isReceiverEmpty())
							reset();
						else {
							nextFragment = 0;
							send(getNextFragment());
						}
					}
				}
			}
		});
	}

	protected void saveMessage(SMSReply reply) {
		RecordEntry entry = new RecordEntry();
		if (reply.isQQ)
			entry.owner = reply.qq;
		else
			entry.owner = 9999;
		entry.sender = main.getMyModel().qq;
		entry.receiver = 0;
		entry.senderParent = 0;
		entry.type = IKeyConstants.NORMAL;
		entry.time = System.currentTimeMillis();
		if (reply.isQQ)
			entry.message = textCache;
		else
			entry.message = reply.mobile + '|' + textCache;
		main.getRecordManager().addRecord(entry);
	}

	protected void rebuildReceiverList(List<SMSReply> replies) {
		mobiles.clear();
		friends.clear();
		for (SMSReply reply : replies) {
			if (reply.replyCode == QQ.QQ_REPLY_SMS_QUEUED) {
				if (reply.isQQ)
					friends.add(reply.qq);
				else
					mobiles.add(reply.mobile);
			}
		}
	}

	protected boolean isReceiverEmpty() {
		return mobiles.isEmpty() && friends.isEmpty();
	}

	protected void reset() {
		btnSend.setText(button_send_accel);
		btnSend.setEnabled(true);
		stop = true;
		sending = false;
		nextFragment = 0;
		expected = 0;
	}

	/**
	 * @return Returns the receiver.
	 */
	public String getReceiver() {
		return receiver;
	}

	/**
	 * @param receiver The receiver to set.
	 */
	public void setReceiver(String receiver) {
		this.receiver = receiver;
		textReceiver.setText(receiver);
	}

	/**
	 * @param receiver
	 */
	private void rebuildReceiverList(String receiver) {
		friends.clear();
		mobiles.clear();
		StringTokenizer st = new StringTokenizer(receiver, ",");
		while (st.hasMoreTokens()) {
			String rec = st.nextToken().trim();
			int qq = Util.getInt(rec, 0);
			if (qq != 0 && ModelRegistry.hasUser(qq) && !friends.contains(qq)) {
				friends.add(qq);
			} else if (!mobiles.contains(rec)) {
				mobiles.add(rec);
			}
		}
	}

	@Override
	public void shellActivated(ShellEvent e) {
		super.shellActivated(e);
		stopBlink();
	}

	public void shellClosed(ShellEvent e) {
		super.shellClosed(e);
		if (singleMode) {
			if (isUser)
				main.getShellRegistry().removeSMSWindow(friend);
			else
				main.getShellRegistry().removeSMSWindow(mobile);
		} else
			main.getShellRegistry().deregisterSMSWindow();
	}

	/**
	 * 计算分片数
	 */
	private void calculateFragmentCount() {
		textCache = inputBox.getText();
		int length = textCache.length();
		if (length > maxFragmentLength) {
			fragmentCount = length / (maxFragmentLength - 4) + 1;
		} else
			fragmentCount = 1;
	}

	/**
	 * 发送短消息
	 */
	protected void send() {
		if (stop) {
			calculateFragmentCount();
			receiver = textReceiver.getText();
			rebuildReceiverList(receiver);
			if (textCache.length() == 0)
				MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_sms_empty);
			else if (fragmentCount > 9)
				MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_too_long_sms);
			else if (mobiles.isEmpty() && friends.isEmpty())
				MessageDialog.openWarning(getShell(), message_box_common_warning_title, message_box_sms_no_receiver);
			else {
				btnSend.setText(button_stop);
				send(getNextFragment());
				stop = false;
			}
		} else {
			btnSend.setText(button_send_accel);
			stop = true;
			if (sending)
				btnSend.setEnabled(false);
		}
	}

	/**
	 * 发送一个分片
	 */
	private void send(byte[] msg) {
		append(NLS.bind(sms_sending, new Object[] { Util.getString(msg), String.valueOf(nextFragment + 1), String.valueOf(fragmentCount) }), myStyle);
		expected = main.getClient().sendSMS(mobiles, friends, textSender.getText(), msg, (char) nextFragment);
		sending = true;
	}

	/**
	 * @return
	 * 		下一个分片的字节数组
	 */
	protected byte[] getNextFragment() {
		if (nextFragment >= fragmentCount)
			return null;
		else if (fragmentCount == 1) {
			fragmentCache = Util.getBytes(inputBox.getText());
			return fragmentCache;
		} else {
			String text = inputBox.getText();
			StringBuilder sb = new StringBuilder();
			sb.append(nextFragment + 1);
			sb.append('/');
			sb.append(fragmentCount);
			sb.append((char) 0x0A);
			sb.append(text.substring(nextFragment * (maxFragmentLength - 4), Math.min((nextFragment + 1) * (maxFragmentLength - 4), text.length())));
			fragmentCache = Util.getBytes(sb.toString());
			return fragmentCache;
		}
	}

	public void friendSelected(FriendSelectionEvent e) {
		for (Model model : e.getModels()) {
			if (model instanceof User) {
				User f = (User) model;
				friends.add(f.qq);
			}
		}
		synchronizeList();
	}

	public void friendDeselected(FriendSelectionEvent e) {
		for (Model model : e.getModels()) {
			if (model instanceof User) {
				User f = (User) model;
				friends.remove(new Integer(f.qq));
			}
		}
		synchronizeList();
	}

	private void synchronizeList() {
		StringBuilder sb = new StringBuilder();
		for (String mobile : mobiles)
			sb.append(mobile).append(',');
		for (Integer qq : friends)
			sb.append(qq).append(',');
		if (sb.length() > 0)
			sb.deleteCharAt(sb.length() - 1);
		receiver = sb.toString();
		textReceiver.setText(receiver);
	}
}

⌨️ 快捷键说明

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